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
相关产品推荐
相关产品推荐

