从Swift中的选择器调用协议函数

时间:2016-07-16 02:25:33

标签: ios swift protocols delegation

我有一个协议,充当一个视图和另一个视图之间的委托。

协议看起来像这样:

protocol MyProtocol: class {
    func functionOne()
}

协议在View2中实现,类似于:

extension View2:MyProtocol {
    func functionOne() {
        print("Hello World"
    }
}

现在我希望View1中的按钮目标调用此方法。因此,View1我有一句话:

myButton(self, action: #selector(delegate?.functionOne), forControlEvents: .TouchUpInside)

但按钮行错误"Use of unresolved identifier 'functionOne'",这是我以前在其他问题中看不到的错误。

如果我在functionTwo中设置View1并将目标设置为functionTwo,然后通过直接调用functionTwo来实现delegate?.functionOne,则一切正常。但这似乎非常不优雅。

1 个答案:

答案 0 :(得分:6)

@objc
protocol MyProtocol: class {
    func functionOne()
}


button.addTarget(self, action: #selector(MyProtocol.functionOne), for: .touchUpInside)

上述语法并不关心协议的实现位置。它只关心函数的名称及其签名。由于这种行为,我们说MyProtocol.functionOne并且这足以说明问题。某些类符合该类并实现具有该签名和名称的函数。