我无法弄清楚为什么我在最后一行收到此错误:'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)
你们有人可以帮助我吗?
在SKNode类中,此消息的块参数属于该类型 (void (^)(SKNode *node, BOOL *stop))
当Swift导入一个Objective-C类时,它的所有消息参数和返回值都作为选项导入 - 传递给函数的参数总是NSString?或者NDSData?,而不仅仅是NSString或NSData.他们这样做是因为在对象-所有的指针可以是零,但是var在斯威夫特不能是零,除非它在最后一个问号,从而使它成为一个"可选"的类型.
因此,当您定义时enmuerationBlock,它应该是类型
(SKNode?, CMutablePointer<ObjCBool>) -> Void
Run Code Online (Sandbox Code Playgroud)
当你有一个可变的指针,取消引用它通过获得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中测试它,它总是会失败,但是当你把它编译成一个合适的目标时它会起作用.
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |