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

Swift5.7语法修正:逃逸闭包捕获非逃逸参数'block'错误解决

Swift中SCNAction扩展的逃逸闭包错误解决方法

你遇到的报错“Escaping closure captures non-escaping parameter 'block'”,核心原因是SCNAction.run的闭包属于逃逸闭包——它会在方法返回后过一段时间(等待动作完成后)才执行,而你定义的block参数默认是非逃逸的(Swift默认函数参数闭包都是非逃逸的,只能在方法内部同步执行)。当逃逸闭包捕获这个非逃逸的block时,Swift的安全机制就会抛出错误。

修正方法

只需要在block参数前添加@escaping修饰符,明确标记这个闭包允许被逃逸使用:

extension SCNAction {

    class func waitForDurationThenRemoveFromParent(duration: TimeInterval) -> SCNAction {
        let wait = SCNAction.wait(duration: duration)
        let remove = SCNAction.removeFromParentNode()
        return SCNAction.sequence([wait, remove])
    }

    // 重点:在block参数前添加@escaping
    class func waitForDurationThenRunBlock(duration: TimeInterval, block: @escaping ((SCNNode?) -> Void)) -> SCNAction {
        let wait = SCNAction.wait(duration: duration)
        let runBlock = SCNAction.run { node in
            block(node)
        }
        return SCNAction.sequence([wait, runBlock])
    }

    class func rotateByXForever(x: CGFloat, y: CGFloat, z: CGFloat, duration: TimeInterval) -> SCNAction {
        let rotate = SCNAction.rotateBy(x: x, y: y, z: z, duration: duration)
        return SCNAction.repeatForever(rotate)
    }
}

补充说明

@escaping的作用是告诉Swift:这个闭包可能会在函数返回后被调用、存储或者传递到其他地方使用。因为你的场景里,block会被封装到SCNAction的序列中,等待wait动作完成后才执行,完全符合逃逸闭包的使用场景,所以必须添加这个修饰符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:39:20