SpriteKit 展开可选错误 (Swift)

Posted

技术标签:

【中文标题】SpriteKit 展开可选错误 (Swift)【英文标题】:SpriteKit Unwrapping Optional Error (Swift) 【发布时间】:2016-06-03 15:59:26 【问题描述】:

每当我运行我的项目时,我都会遇到错误的指令错误...

ground.physicsBody!.dynamic = false

这是我运行这个 sn-p 的完整代码。我不确定发生了什么,而且我对可选选项没有太多经验。

代码:

var ground = SKSpriteNode()
ground.position = CGPointMake(0, 0)
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 30))
let groundTexture = SKTexture(imageNamed: "Red.png")
ground = SKSpriteNode(texture: groundTexture)
ground.physicsBody!.dynamic = false
ground.physicsBody?.allowsRotation = false

ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
ground.physicsBody!.contactTestBitMask = ColliderType.Object.rawValue
ground.physicsBody!.collisionBitMask = ColliderType.Object.rawValue
self.addChild(ground)

【问题讨论】:

【参考方案1】:

您在创建其物理体后重新初始化 ground,因此新对象没有物理体,因此显示 nil 错误。

将您的代码更改为

let groundTexture = SKTexture(imageNamed: "Red.png")
var ground = SKSpriteNode(texture: groundTexture)
ground.position = CGPointMake(0, 0)
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 30))
ground.physicsBody!.dynamic = false
ground.physicsBody?.allowsRotation = false

ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
ground.physicsBody!.contactTestBitMask = ColliderType.Object.rawValue
ground.physicsBody!.collisionBitMask = ColliderType.Object.rawValue
self.addChild(ground)

根据评论,当您遇到 在展开选项时发现 nil 的错误时,一般做法是使用?if let 来安全地展开。在这种情况下,它可以像这样实现

if let physicsBodyObject = ground.physicsBody 
    physicsBodyObject.dynamic = false
    physicsBodyObject.allowsRotation = false
    //other code

【讨论】:

您的回答是正确的,但我建议您对未来的读者进行一些微调。为避免一开始崩溃,您应该更换所有 !和 ?只要有可能。即使您知道物理实体在那里,也不是强制展开的最佳做法。 或者更好的是,单独创建物理体,配置完成后分配给节点。

以上是关于SpriteKit 展开可选错误 (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil

Swift 中的可选类型错误:致命错误:在展开可选值时意外发现 nil

Swift:致命错误:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil

Swift 错误 - 致命错误:在展开可选值时意外发现 nil [重复]