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

Ken*_*eth 4 protocols delegation ios swift

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

协议看起来像这样:

protocol MyProtocol: class {
    func functionOne()
}
Run Code Online (Sandbox Code Playgroud)

协议的实现方式View2如下:

extension View2:MyProtocol {
    func functionOne() {
        print("Hello World"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我希望这个方法被一个按钮的目标调用View1.所以在View1我有一条线:

myButton(self, action: #selector(delegate?.functionOne), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud)

但是按钮行错误"Use of unresolved identifier 'functionOne'",这是我以前在其他问题中没有见过的错误.

如果我functionTwo进入View1并设置目标functionTwo,然后functionTwo通过直接调用实现,一切都有效delegate?.functionOne.但这似乎非常不优雅.

Bra*_*don 6

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


button.addTarget(self, action: #selector(MyProtocol.functionOne), for: .touchUpInside)
Run Code Online (Sandbox Code Playgroud)

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

  • 我不在乎委派。我只是警告您要小心。您正在说“向功能发送一条消息给自己”。因此self必须具有functionOne实现,否则发生崩溃。试试看。 (2认同)