首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“SKNode!”不是“SKNode”的子类型

“SKNode!”不是“SKNode”的子类型
EN

Stack Overflow用户
提问于 2014-06-03 23:14:10
回答 1查看 1.3K关注 0票数 3

我不明白为什么最后一行会出现这个错误:“SKNode!”不是“SKNode”的子类型

代码语言:javascript
复制
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)

}

你们有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-03 23:25:44

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

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

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

代码语言:javascript
复制
(SKNode?, CMutablePointer<ObjCBool>) -> Void

编辑回答flainez的问题如下:

当您有一个可变指针时,可以通过这样获得一个UnsafePointer来取消它的引用。

代码语言:javascript
复制
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中测试它,它总是失败,但是当您将它编译到适当的目标时,它会工作。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24026500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档