• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:34:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在这个例子中模拟了我的情况:

protocol MyProtocol {

    func doSomething()
}

extension MyProtocol {

    func doSomething() {
        print("Do something")
    }
}

class MyViewController: UIViewController, MyProtocol {

    let button = UIButton()

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

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

error: argument of '#selector' refers to instance method 'doSomething()' that is not exposed to Objective-C

我能否修复或解决此问题?



Best Answer-推荐答案


您的协议(protocol)与 Objective-C 不兼容。您需要使用 @objc 对其进行注释,否则您将无法使用选择器,因为方法不会使用 Objective-C 调度。

编辑

所以我应该在写上述内容之前在 Playground 上尝试一下。

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

例如

@objc protocol MyProtocol 
{
    @objc func doSomething();
} 

extension UIViewController: MyProtocol
{
    @objc func doSomething() { /* implementation */ }   
}

关于ios - 协议(protocol)中的默认实现不适用于我的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43678422/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap