将参数传递给实现协议的方法并在swift中扩展一个类

时间:2015-01-28 17:22:05

标签: ios templates generics swift protocols

在Objective-C中,您可以通知编译器类型应该是特定类的后代,并且还符合协议(例如“UIViewController * foo = nil”)。

我正在尝试使用Swift做类似的事情,看起来这需要使用泛型。这是我期望的工作:

import UIKit

protocol MyProtocol {
    var foo: String {get set}
}

class MyViewController: UIViewController, MyProtocol {
    var foo: String = ""
}

func doAThing<T: UIViewController where T: MyProtocol>(vc: T) -> T? {
    var myViewController: T? = nil

    myViewController = MyViewController(nibName: nil, bundle: nil)

    return myViewController
}

我得到的错误是:'MyViewController'无法转换为'T'。我是否可以不将泛型与“具体”,未参数化的类一起使用?我仍然围绕着这部分语言,感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

假设您希望MyViewController成为实现UIViewController的{​​{1}}的任何子类。请注意,确实没有一种简洁的方法可以回到MyProtocol方法添加与协议相关的任何内容。

我认为您正在寻找的是:

UIViewController

由于允许swift函数覆盖仅因返回类型而不同,并且类型推断能够在它们之间进行选择,因此在这种情况下protocol MyProtocol { var foo: String {get set} } class MyViewController: UIViewController, MyProtocol { var foo: String = "" } class MyOtherViewController : UIViewController, MyProtocol { var foo = "My other view controller" } func doAThing<T: UIViewController where T: MyProtocol>() -> T? { return T(nibName: nil, bundle: nil) } let myViewController : MyViewController? = doAThing() let myOtherViewController : MyOtherViewController? = doAThing() let myProtocol : MyProtocol? = myViewController 并不真正需要参数。