菜鸟教程小白 发表于 2022-12-11 19:34:50

ios - 协议(protocol)中的默认实现不适用于我的情况


                                            <p><p>我在这个例子中模拟了我的情况:</p>

<pre><code>protocol MyProtocol {

    func doSomething()
}

extension MyProtocol {

    func doSomething() {
      print(&#34;Do something&#34;)
    }
}

class MyViewController: UIViewController, MyProtocol {

    let button = UIButton()

    override func viewDidLoad() {
      super.viewDidLoad()
      button.addTarget(self, action: #selector(doSomething), for: .touchUpInside)
    }
}
</code></pre>

<p>我期待 <code>MyViewController</code> 已经实现了 <code>doSomething()</code> 函数,因为它是在 <code>MyProtocol</code> 扩展中实现的。不幸的是,我收到了这个错误:</p>

<blockquote>
<p>error: argument of &#39;#selector&#39; refers to instance method
&#39;doSomething()&#39; that is not exposed to Objective-C</p>
</blockquote>

<p>我能否修复或解决此问题?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的协议(protocol)与 Objective-C 不兼容。您需要使用 <code>@objc</code> 对其进行注释,否则您将无法使用选择器,因为方法不会使用 Objective-C 调度。</p>

<p><strong>编辑</strong></p>

<p>所以我应该在写上述内容之前<em></em>在 Playground 上尝试一下。</p>

<p>您不能将 <code>@objc</code> 函数添加到 Swift 中的协议(protocol)扩展。你必须把它放在类里面。或者你可以扩展 UIViewController 来实现 <code>MyProtocol</code></p>

<p>例如</p>

<pre><code>@objc protocol MyProtocol
{
    @objc func doSomething();
}

extension UIViewController: MyProtocol
{
    @objc func doSomething() { /* implementation */ }   
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 协议(protocol)中的默认实现不适用于我的情况,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43678422/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43678422/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 协议(protocol)中的默认实现不适用于我的情况