【问题标题】:Alternative method for performSelector in SKAction in SwiftSwift 中 SKAction 中 performSelector 的替代方法
【发布时间】:2014-07-30 15:55:36
【问题描述】:

我正在将 Sprikit 应用程序转换为 Swift。但是我转换这个方法有问题:

SKAction *releaseBalls = [SKAction sequence:@[[SKAction performSelector:@selector(createMyNode) onTarget:self],[SKAction waitForDuration:1]    ]];

在 Swift 中是否有任何替代代码?谢谢

【问题讨论】:

  • 到底是什么问题?
  • @0x7fffffff 该方法在 Swift 中不存在,它只是 obj-c。
  • 只需要使用runBlock,在闭包中调用self.createMyNode
  • 根据你在方法/函数“createMyNode”中的表现,你应该小心,因为“SKAction.runBlock()”在 Swift 中确实接受了一个闭包,这可能会提高强大的潜力参考周期。根据文档,SKAction.runBlock 接受类型为“dispatch_block_t!”的周界。定义为“typealias dispatch_block_t = () -> Void”
  • 可以为闭包定义一个捕获列表,避免强引用循环。 SKAction.runBlock() { [unowned self] () in self.createMyNode() }the documentation 中查看。

标签: ios objective-c sprite-kit swift


【解决方案1】:

试试这个

class MyScene: SKScene {

    func doAction() {
        let releaseBalls = SKAction.sequence([
            SKAction.runBlock(self.createMyNode),
            SKAction.waitForDuration(1)
            ])
        // run action
    }

    func createMyNode() {
        // create the nodes
    }
}

【讨论】:

  • 嗨!使用它并调用 class.doAction() 时,我在 Xcode 中收到错误消息:“找不到接受提供的参数的 doAction 的重载”我错过了什么吗?
  • 何塞,您是在调用MyScene.doAction(),还是在MyScene (var scene: MyScene = MyScene(); scene.doAction()) 的实例上调用doAction?您将其描述为 class.doAction() 的事实让我认为您正在尝试将 doAction 作为类方法而不是作为实例方法运行。
  • 很好的答案,或者干脆使用:SKAction.sequence([SKAction.runBlock({run_some_code(); run_other_code()}), SKAction.waitForDuration(3)]) 而不是 SKAction.runBlock(self.createMyNode)(需要 ';' 作为分隔符!)
  • @JoséMaría 您需要删除 () 例如SKAction.runBlock(class.doAction)。我有点晚了,但遇到了同样的问题:)
【解决方案2】:

虽然其他解决方案通常是首选,但未来的读者可能想知道performSelector 和同一家族的其他成员从 Swift 2 开始可用。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多