chciałbym zwracają UIViewController
zgodny MyProtocol
od sposobu, więc używam podpis metoda:rodzajowych w Swift - „Generic parametr«T»nie można wywnioskować
func myMethod<T where T : UIViewController, T : MyProtocol>() -> T {
Pierwszą rzeczą nie rozumiem: jeśli myMethod
powraca np MyViewController
który musi po podpis, muszę zmusić oddanych go:
class MyViewController: UIViewController, MyProtocol
nie mogę po prostu return MyViewController()
ale muszę oddać go tak: return MyViewController() as! T
- dlaczego jest to konieczność y?
A druga rzecz: jak mogę gdzieś skorzystać z tej metody? Nie mogę po prostu powiedzieć
let x = myMethod() as? UIViewController
jak pojawia się błąd
Generic parameter 'T' could not be inferred
Jak mogę osiągnąć coś takiego? Jeśli wyrzucę go do MyViewController
, to działa, ale chciałbym tego uniknąć.
EDIT: Przykład
class MyViewController : UIViewController, MyProtocol {
}
protocol MyProtocol {
}
func myMethod<T>() -> T where T : UIViewController, T : MyProtocol {
return MyViewController() as! T // why is the cast necessary?
}
ok, mam dostać jedną część, ale dlaczego jest obsada do T
konieczne? MyViewController
jest podklasą UIViewController
i jest zgodna z protokołem, więc nie należy wykonywać rzutowania, prawda?
Co dokładnie próbujesz osiągnąć? Dlaczego w ogóle używasz generycznych? – Alexander
Chciałbym pracować z typem, który jest 'UIViewController' i jest zgodny z określonym protokołem; Mam różne klasy, które są zgodne z tymi zasadami, dlatego nie chcę używać określonego typu. – swalkner
Nie chcesz zaakceptować odpowiedzi? – Honey