Я хотел бы вернуть метод 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 и соответствует протоколу, поэтому никакого приведения не нужно, правильно?