Swift中SKAction的performSelector的替代方法

15

我正在将一个Sprkit应用转换为Swift。但是我遇到了一个问题,无法转换这个方法:

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

在 Swift 中有没有其他的代码替代方案?谢谢


1
问题到底是什么? - Mick MacCallum
@0x7fffffff 在 Swift 中不存在这个方法,只有 obj-c 有。 - Jason Coco
1
只需使用 runBlock,在闭包中调用 self.createMyNode 即可。 - Jason Coco
根据你在 "createMyNode" 方法/函数中执行的操作,你应该小心谨慎,因为在Swift中,“SKAction.runBlock()”实际上接受了一个闭包,这可能会导致强引用循环的出现。根据文档,SKAction.runBlock 接受类型为 “dispatch_block_t!” 的参数,其定义为 “typealias dispatch_block_t = () -> Void”。 - Raz
你可以为闭包定义一个捕获列表,以避免强引用循环。SKAction.runBlock() { [unowned self] () in self.createMyNode() }文档中查看。 - Brendon Roberto
2个回答

16

尝试一下这个

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的重载”。我有什么遗漏吗? - José María
Jose,你是在调用 MyScene.doAction() 还是在调用 MyScene 实例上的 doActionvar scene: MyScene = MyScene(); scene.doAction())?你将其描述为 class.doAction() 的事实让我想到你正在尝试将 doAction 作为类方法而不是实例方法运行。 - Brendon Roberto
优秀的答案,或者简单地使用:SKAction.sequence([SKAction.runBlock({run_some_code(); run_other_code()}), SKAction.waitForDuration(3)])代替SKAction.runBlock(self.createMyNode)(那个';'是必需的分隔符!) - Mr. T
@JoséMaría,你需要删除 (),例如 SKAction.runBlock(class.doAction)。我有点晚了,但遇到了同样的问题 :) - Dima Deplov

0

虽然通常更喜欢其他解决方案,但未来的读者可能会想知道,performSelector和同一系列的其他成员在Swift 2中已经可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接