You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 3中使用#selector触发“未解析标识符”错误求助

解决Swift 3中addTarget的"Use of unresolved identifier"错误

这个问题是Swift 3对#selector的类型安全要求比旧的字符串selector写法严格导致的。原来的Objective-C风格字符串写法允许模糊指定方法,但Swift 3的#selector需要明确告诉编译器这个方法属于哪个类型——毕竟你把target设为nil时,编译器没法自动推断该去哪个类里找addNewObject方法(多个类都有这个方法)。

下面给你几个可行的解决方案:

  • 利用父类统一声明方法
    如果所有包含myBtn实例的类都继承自同一个父类,那可以在父类里定义addNewObject方法,然后在selector里明确指定父类:
myBtn.addTarget(nil, action: #selector(ParentClass.addNewObject), for: .touchUpInside)

这样编译器就能准确找到方法的归属,同时事件依然会沿着响应链传递到正确的子类对象执行方法。

  • 通过@objc协议约束
    如果这些类没有共同父类,但都实现了同一个方法,可以定义一个带@objc标记的协议,让这些类遵循它:
@objc protocol AddObjectCapable {
    func addNewObject()
}

然后selector写成协议的方法:

myBtn.addTarget(nil, action: #selector(AddObjectCapable.addNewObject), for: .touchUpInside)

这种方式更灵活,适合没有继承关系的类共享方法的场景。

  • 兼容旧的字符串Selector写法(不推荐)
    如果你只是想快速兼容,也可以回到旧的字符串写法,但编译器会给出类型不安全的警告:
myBtn.addTarget(nil, action: Selector("addNewObject"), for: .touchUpInside)

虽然能运行,但Swift官方更推荐用#selector的类型安全写法,避免运行时找不到方法的崩溃。

内容的提问来源于stack exchange,提问作者JeremyRaven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:25