符合protocl的Swift属性

时间:2016-09-01 21:21:57

标签: swift generics properties protocols

我有这个协议:

protocol TestProtocol {
     func doSomething
}

我想使用这个协议来确保某些属性符合它:

class MyClass {
   var detailVC : UIViewController <TestProtocol>
}
像好老的ObjC一样,确保detailVC符合TestProtocol

3 个答案:

答案 0 :(得分:2)

protocol MyViewControllerProtocol {
    func protoFunc()
}

class MyClass {
    var prop: MyViewControllerProtocol?
}

就这么简单。但是,如果您希望预定义的类符合协议,那么您需要进行扩展(但这适用于整个类)或者您将其子类化。

因此...

作为整个班级的延伸:

extension UIViewController: MyProtocol {
    func protoFunc() {
        print("do whatever")
    }
}

在这种情况下,扩展时,您可以将属性设置为:

var myProperty: UIViewController?

在扩展之后,它将符合要求。

或者只是将其子类化为:

class MyConformingViewController: UIViewController, MyProtocol {
    override func protoFunc() {
        print("do whatever")
    }
}

在这种情况下,您只需将属性设置为:

var myProp: MyConformingViewController?

由于该类被设置为符合它,因此会自动确认MyProtocol

您不能强制预先指定的类符合首先尚未指定符合该协议的协议。

e.g。 UIViewController最初未设置为向MyOtherProtocol确认例如

这首先会破坏协议的目标。这就是为什么要么将它扩展为符合,要么将其子类化为符合。

答案 1 :(得分:0)

所以你可以实现如下方法:

class detailVC : UIViewController, TestProtocol {
    func doSomething() {}
}

答案 2 :(得分:0)

在Swift中,你不能拥有一种类型的变量,也可以声明为协议类型。

您可以拥有的是一个需要符合多个协议的变量。

 class MyClass {
    var detailVC : TestProtocol
 }

 class MyClass {
    var detailVC : protocol<TestProtocol,SecondProtocol>
 }