在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”。我可以不使用泛型与“具体的”,非参数化类?我仍然在用我的头脑去理解这部分语言,谢谢你的帮助。

最佳答案

假设您希望MyViewController是实现UIViewControllerMyProtocol的任何子类,请注意,除了添加与协议相关的任何内容之外,确实没有一种干净的方法返回到UIViewController方法。
我想你要找的是:

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

由于swift函数重写只允许根据返回类型而有所不同,并且类型推断能够在它们之间进行选择,doAThing在这种情况下实际上不需要参数。

关于ios - 将参数传递给实现协议(protocol)并快速扩展类的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28198473/

10-16 04:52