【问题标题】:Calling a Protocol Function from A Selector in Swift从 Swift 中的选择器调用协议函数
【发布时间】:2016-11-19 07:32:30
【问题描述】:

我有一个协议充当一个视图和另一个视图之间的代理。

协议看起来(类似于):

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,则一切正常。但这似乎很不雅。

【问题讨论】:

标签: ios swift protocols delegation


【解决方案1】:
@objc
protocol MyProtocol: class {
    func functionOne()
}


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

上面的语法并不关心协议是在哪里实现的。它只关心函数的名称及其签名。由于这种行为,我们说MyProtocol.functionOne,这就足够了。某些类符合此要求并实现具有该签名和名称的函数。

【讨论】:

  • 请注意,如果self实现functionOne,您将崩溃。
  • @matt 等待,“如果 self 没有实现 functionOne”?你不是说MyProtocol 类没有实现functionOne 吗?使用委托的全部意义在于self 故意不实现functionOne
  • 我不关心委派。我只是提醒你要小心。您说的是“向自己发送 functionOne 消息”。所以 self 必须有一个 functionOne 实现,否则当发生这种情况时你会崩溃。试试看。
  • 只需将目标值(self)替换为您的协议实现(委托)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多