从 Swift 中的选择器调用协议函数
Calling a Protocol Function from A Selector in Swift
我有一个协议,充当一个视图和另一个视图之间的委托。
协议看起来(类似于):
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'"
,这是我以前在其他问题中没有看到的错误。
如果我在View1
中创建functionTwo
并将目标设置为functionTwo
,然后直接调用delegate?.functionOne
实现functionTwo
,一切正常。但这似乎很不优雅。
@objc
protocol MyProtocol: class {
func functionOne()
}
button.addTarget(self, action: #selector(MyProtocol.functionOne), for: .touchUpInside)
以上语法不关心协议的实现位置。它只关心函数的名称及其签名。由于这种行为,我们说 MyProtocol.functionOne
就足够了。一些 class 符合这一点并使用该签名和名称实现一个函数。
我有一个协议,充当一个视图和另一个视图之间的委托。
协议看起来(类似于):
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'"
,这是我以前在其他问题中没有看到的错误。
如果我在View1
中创建functionTwo
并将目标设置为functionTwo
,然后直接调用delegate?.functionOne
实现functionTwo
,一切正常。但这似乎很不优雅。
@objc
protocol MyProtocol: class {
func functionOne()
}
button.addTarget(self, action: #selector(MyProtocol.functionOne), for: .touchUpInside)
以上语法不关心协议的实现位置。它只关心函数的名称及其签名。由于这种行为,我们说 MyProtocol.functionOne
就足够了。一些 class 符合这一点并使用该签名和名称实现一个函数。