Swift 4.2调用performSelector报参数类型错误,求解决
Swift 4.2迁移中
performSelector调用报错的解决办法 为什么会报错?
Swift 4.2对Objective-C风格的performSelector(_:)做了严格限制——编译器认为这种通过Selector调用方法的方式类型不安全,不再允许直接使用。另外你代码里的强制解包(!)也容易引发崩溃,不符合Swift的安全编程规范。
两种解决思路
思路1:适配原有target-selector逻辑(兼容OC写法)
先保证你的回调方法和目标类都标记了@objc(因为Swift 4.2默认不暴露方法给OC运行时),然后用perform(_:)替代performSelector(_:),同时用可选绑定避免强制解包:
修改后的代码:
private func circleCompleted() { endTouching() if dissappear_on_completion { self.removeFromSuperview() } // 可选绑定安全访问目标和选择器 if let target = completed_target, let selector = completed_selector { target.perform(selector) } } private func touchFailed() { endTouching() if let target = failed_target, let selector = failed_selector { target.perform(selector) } } private func touchMoved(rad: CGFloat) { if let target = moved_target, let selector = moved_selector { target.perform(selector, with: rad as AnyObject) } }
注意:如果你的回调方法没有加@objc,必须补上,比如:
@objc func handleCircleCompleted() { // 你的完成逻辑 }
思路2:改用Swift闭包(更推荐的现代写法)
抛弃老旧的target-selector模式,用Swift闭包实现回调,这是更符合Swift风格的安全写法:
- 先定义闭包类型(如果需要复用):
typealias CircleCompletionHandler = () -> Void typealias CircleFailedHandler = () -> Void typealias CircleMovedHandler = (CGFloat) -> Void
- 替换原来的
completed_target、completed_selector等属性:
var onCircleCompleted: CircleCompletionHandler? var onCircleFailed: CircleFailedHandler? var onCircleMoved: CircleMovedHandler?
- 修改触发回调的代码:
private func circleCompleted() { endTouching() if dissappear_on_completion { self.removeFromSuperview() } // 可选调用闭包,自动处理nil情况 onCircleCompleted?() } private func touchFailed() { endTouching() onCircleFailed?() } private func touchMoved(rad: CGFloat) { onCircleMoved?(rad) }
- 设置回调的地方改成:
// 示例:给圆形视图设置完成回调 yourCircleView.onCircleCompleted = { print("圆形绘制完成") // 你的业务逻辑 }
这种写法不需要依赖OC运行时,类型检查更严格,也不会出现selector相关的问题,是Swift开发的首选方式。
内容的提问来源于stack exchange,提问作者AlexTok6o
相关产品推荐
相关产品推荐

