我不明白为什么最后一行会出现这个错误:“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)
}你们有人能帮我吗?
发布于 2014-06-03 23:25:44
在SKNode类中,此消息的块参数为(void (^)(SKNode *node, BOOL *stop))类型。
当Swift导入目标C类时,它的所有消息参数和返回值都作为选项导入--传递给函数的参数总是NSString?或NDSData?,而不仅仅是NSString或NSData。他们这样做是因为Obj-C中的所有指针都可以是零,但是Swift中的var不能是零,除非它在末尾有问号,因此它是一个“可选”类型。
因此,当您定义enmuerationBlock时,它应该是
(SKNode?, CMutablePointer<ObjCBool>) -> Void编辑回答flainez的问题如下:
当您有一个可变指针时,可以通过这样获得一个UnsafePointer来取消它的引用。
var val :CMutablePointer<Bool> = /* get this from somewhere */
val.withUnsafePointer() { (p :UnsafePointer<Bool>) in
p.memory = true /* or whatever */
}.withUnsafePointer向块生成一个UnsafePointer<T>,而UnsafePointer<T>具有一个可分配的内存属性。
烦人:您不能在游乐场的REPL中测试它,它总是失败,但是当您将它编译到适当的目标时,它会工作。
https://stackoverflow.com/questions/24026500
复制相似问题