'SKNode!' 不是'SKNode'的子类型

Dan*_*xon 3 swift

我无法弄清楚为什么我在最后一行收到此错误:'SKNode!' 不是'SKNode'的子类型

func move_background(){
    let enumerationBlock: (SKNode, CMutablePointer<ObjCBool>) -> Void = { bg, stop in
        var bg_velocity = CGPointMake(0,CGFloat(-self.bg_velocity))
        var distance_to_move = self.point_multiply_scalar(bg_velocity, b: self.dt!)
        bg.position = self.point_add(bg.position, b: distance_to_move)

        if bg.position.y <= -bg.frame.height {
            bg.position = CGPointMake(bg.position.x, bg.position.y + bg.frame.height * 2)
        }
    }

    self.enumerateChildNodesWithName("bg", usingBlock: enumerationBlock)

}
Run Code Online (Sandbox Code Playgroud)

你们有人可以帮助我吗?

ilu*_*pra 8

在SKNode类中,此消息的块参数属于该类型 (void (^)(SKNode *node, BOOL *stop))

当Swift导入一个Objective-C类时,它的所有消息参数和返回值都作为选项导入 - 传递给函数的参数总是NSString?或者NDSData?,而不仅仅是NSStringNSData.他们这样做是因为在对象-所有的指针可以是零,但是var在斯威夫特不能是零,除非它在最后一个问号,从而使它成为一个"可选"的类型.

因此,当您定义时enmuerationBlock,它应该是类型

(SKNode?, CMutablePointer<ObjCBool>) -> Void
Run Code Online (Sandbox Code Playgroud)

编辑回答flainez的问题如下:

当你有一个可变的指针,取消引用它通过获得UnsafePointer这样

var val :CMutablePointer<Bool> = /* get this from somewhere */

val.withUnsafePointer() { (p :UnsafePointer<Bool>) in
    p.memory = true /* or whatever */
}
Run Code Online (Sandbox Code Playgroud)

.withUnsafePointer产生一个UnsafePointer<T>块,并UnsafePointer<T>具有可分配的内存属性.

恼人的:你无法在Playground的REPL中测试它,它总是会失败,但是当你把它编译成一个合适的目标时它会起作用.