Я хотел бы вернуть метод UIViewController
, соответствующий MyProtocol
из метода, поэтому я использую подпись метода:
func myMethod<T where T : UIViewController, T : MyProtocol>() -> T {
Первое, что я не понимаю: если myMethod
возвращается, например. a MyViewController
, который должен иметь следующую подпись, я должен заставить его выполнить:
class MyViewController: UIViewController, MyProtocol
Я не могу просто return MyViewController()
, но мне нужно сделать это следующим образом: return MyViewController() as! T
- зачем это нужно?
И второе: как я могу использовать этот метод где-то? Я не могу просто сказать
let x = myMethod() as? UIViewController
поскольку я получаю ошибку
Generic parameter 'T' could not be inferred
Как я могу добиться чего-то подобного? Если я отбрасываю его на MyViewController
, он работает, но я бы хотел этого избежать.
EDIT: Пример
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, я получаю одну часть, но зачем нужен листинг T
? MyViewController
является подклассом UIViewController
и соответствует протоколу, поэтому никакого приведения не нужно, правильно?