gpt4 book ai didi

swift - 'SKNode !' is not a subtype of ' SKNode'

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:59 26 4
gpt4 key购买 nike

我不明白为什么我在最后一行收到这个错误:'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)

}

你们能帮帮我吗?

最佳答案

在 SKNode 类中,此消息的 block 参数类型为 (void (^)(SKNode *node, BOOL *stop))

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

所以当你定义你的 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>到 block ,和UnsafePointer<T>具有可分配的内存属性。

烦人:您无法在 Playground 的 REPL 中测试它,它总是会失败,但是当您将它编译到正确的目标时它会起作用。

关于swift - 'SKNode !' is not a subtype of ' SKNode',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com