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

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风格的安全写法:

  1. 先定义闭包类型(如果需要复用):
typealias CircleCompletionHandler = () -> Void
typealias CircleFailedHandler = () -> Void
typealias CircleMovedHandler = (CGFloat) -> Void
  1. 替换原来的completed_target、completed_selector等属性:
var onCircleCompleted: CircleCompletionHandler?
var onCircleFailed: CircleFailedHandler?
var onCircleMoved: CircleMovedHandler?
  1. 修改触发回调的代码:
private func circleCompleted() {
    endTouching()
    if dissappear_on_completion { self.removeFromSuperview() }
    // 可选调用闭包,自动处理nil情况
    onCircleCompleted?()
}

private func touchFailed() {
    endTouching()
    onCircleFailed?()
}

private func touchMoved(rad: CGFloat) {
    onCircleMoved?(rad)
}
  1. 设置回调的地方改成:
// 示例:给圆形视图设置完成回调
yourCircleView.onCircleCompleted = {
    print("圆形绘制完成")
    // 你的业务逻辑
}

这种写法不需要依赖OC运行时,类型检查更严格,也不会出现selector相关的问题,是Swift开发的首选方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:33:07