【发布时间】:2016-08-17 14:11:43
【问题描述】:
我想从一个方法返回一个符合MyProtocol的UIViewController,所以我使用方法签名:
func myMethod<T where T : UIViewController, T : MyProtocol>() -> T {
我不明白的第一件事:如果myMethod 返回例如MyViewController 必须遵循签名,我必须强制转换它:
class MyViewController: UIViewController, MyProtocol
我不能简单地return MyViewController(),但我需要这样转换:return MyViewController() as! T - 为什么有必要这样做?
第二件事:我怎样才能在某处使用这种方法?我不能简单地说
let x = myMethod() as? UIViewController
当我得到错误时
Generic parameter 'T' could not be inferred
我怎样才能实现这样的目标?如果我将它转换为 MyViewController 它可以工作,但我当然想避免这种情况。
编辑:示例
class MyViewController : UIViewController, MyProtocol {
}
protocol MyProtocol {
}
func myMethod<T>() -> T where T : UIViewController, T : MyProtocol {
return MyViewController() as! T // why is the cast necessary?
}
好的,我确实得到了一个角色,但为什么需要演员表T? MyViewController 是 UIViewController 的子类并且符合协议,所以不需要强制转换,对吧?
【问题讨论】:
-
你到底想在这里实现什么?你为什么首先使用泛型?
-
我想使用
UIViewController并符合特定协议的类型;我确实有符合此规则的不同类,因此我不想使用特定类型。 -
您不想接受答案吗?