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

时间:2014-06-03 23:14:10

标签: 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)

}

你们有人可以帮助我吗?

1 个答案:

答案 0 :(得分:8)

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

类型

当Swift导入一个Objective-C类时,它的所有消息参数和返回值都作为选项导入 - 传递给函数的参数总是NSString?NDSData?,而不仅仅是{{1 }或NSString。他们这样做是因为Obj-C中的所有指针都可以是nil,但是Swift 中的NSData不能为零,除非它在末尾有一个问号,从而使它成为“可选“类型。

因此,当您定义var时,它应该是

类型
enmuerationBlock

EDIT在下面回答了flainez的问题:

当你有一个可变指针时,你可以通过获得(SKNode?, CMutablePointer<ObjCBool>) -> Void

取消引用它
UnsafePointer

var val :CMutablePointer<Bool> = /* get this from somewhere */ val.withUnsafePointer() { (p :UnsafePointer<Bool>) in p.memory = true /* or whatever */ } 向块生成.withUnsafePointerUnsafePointer<T>具有可分配的内存属性。

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