Swift 5实现SpriteNode渐隐时Xcode报Timer未使用警告问题咨询
问题解答
警告原因说明
这不是Xcode的Bug,是你混淆了两个同名的timer变量:
- 外层通过
let timer = ...声明的是当前作用域下的局部常量,这个变量你在后续代码中完全没有使用 - 闭包内使用的
timer是闭包的入参,和外层的局部常量是完全独立的两个变量
你只需要把外层的局部变量名替换为_即可消除警告:
// 替换掉原来的let timer = ...即可 let _ = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in // 原有闭包逻辑保持不变 node2Delete?.alpha -= 0.1 ghost.alpha += 0.1 if node2Delete?.alpha == 0 { node2Delete?.removeFromParent() timer.invalidate() } }
定时器是否被正常取消
是,定时器会被正常取消。闭包的入参timer指向的就是当前正在执行的这个定时器实例,你在满足条件时调用的timer.invalidate()是有效的,会直接停止当前定时器的运行,后续不会再触发回调。
更优的SpriteNode渐变实现方案
SpriteKit中不推荐使用Timer做节点属性动画,优先使用原生的SKAction方案,它和SpriteKit的渲染循环完全同步,性能更好,也不需要手动管理定时器生命周期,示例代码如下(逻辑和你原有的定时器效果完全对齐):
// 定义渐隐、渐显动画,总时长5秒和原逻辑对齐 let fadeOut = SKAction.fadeOut(withDuration: 5) let fadeIn = SKAction.fadeIn(withDuration: 5) // 动画执行完成后删除待移除节点 let removeNode = SKAction.run { [weak node2Delete] in node2Delete?.removeFromParent() } // 组合动作:两个节点同时渐变,完成后执行删除 let sequence = SKAction.sequence([SKAction.group([fadeOut, fadeIn]), removeNode]) // 启动动画 node2Delete?.run(sequence) ghost.run(fadeIn)
如果需要中途停止动画,直接调用对应节点的removeAllActions()方法即可,比Timer更灵活也更不容易出现内存问题。
内容的提问来源于stack exchange,提问作者user3069232
相关产品推荐
相关产品推荐

