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

