我无法弄清楚为什么我在最后一行收到此错误:'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)
}
你们有人可以帮助我吗?
答案 0 :(得分:8)
在SKNode类中,此消息的块参数属于(void (^)(SKNode *node, BOOL *stop))
当Swift导入一个Objective-C类时,它的所有消息参数和返回值都作为选项导入 - 传递给函数的参数总是NSString?
或NDSData?
,而不仅仅是{{1 }或NSString
。他们这样做是因为Obj-C中的所有指针都可以是nil,但是Swift 中的NSData
不能为零,除非它在末尾有一个问号,从而使它成为“可选“类型。
因此,当您定义var
时,它应该是
enmuerationBlock
当你有一个可变指针时,你可以通过获得(SKNode?, CMutablePointer<ObjCBool>) -> Void
UnsafePointer
var val :CMutablePointer<Bool> = /* get this from somewhere */
val.withUnsafePointer() { (p :UnsafePointer<Bool>) in
p.memory = true /* or whatever */
}
向块生成.withUnsafePointer
,UnsafePointer<T>
具有可分配的内存属性。
烦人:你无法在Playground的REPL中测试它,它总是失败,但是当你把它编译成一个合适的目标时它会起作用。