Swift:SKNode应该有可选类型,可选成员没有成员

时间:2014-10-07 12:59:01

标签: ios iphone xcode swift ios8

在我更新到新的XCode之前,我有一个工作和编译Swift游戏,突然出现了很多错误。这是我无法修复的两个。

func centerOnNode(node: SKNode ) {

   let cameraPositionInScene = node.scene?.convertPoint(node.position, fromNode: node.parent!)

   var y = CGFloat(node.parent?.position.y - cameraPositionInScene?.y!)            
   // ERROR:
   // Operand of postfix ‘!’ should have optional types; Type is CGFLoat

   let x = CGFloat(node.parent.position.x - cameraPositionInScene.x)
   // ERROR: 
   // SKNode? does not have a member position

   // push the camera a bit up
   y -= 75

   node.parent.position = CGPointMake(x, y)

我想我真的不明白!和?商业。包装,展开,可选类型。这在Java或C#术语中是什么?

1 个答案:

答案 0 :(得分:2)

这将有效,假设node.scene 从不 nil,而node.parent 从不 nil:< / p>

let cameraPositionInScene = node.scene!.convertPoint(node.position, fromNode: node.parent!)

var y = CGFloat(node.parent!.position.y - cameraPositionInScene.y)

let x = CGFloat(node.parent!.position.x - cameraPositionInScene.x)

如果那些可能是nil,请改用此代码:

if let cameraPositionInScene = node.scene?.convertPoint(node.position, fromNode: node.parent!) {
    if let parent = node.parent {
        var y = CGFloat(parent.position.y - cameraPositionInScene.y)

        let x = CGFloat(parent.position.x - cameraPositionInScene.x)

        // push the camera a bit up
        y -= 75

        parent.position = CGPointMake(x, y)
    }
}

这将测试以确保所有值都不是nil,并且如果它们不会执行任何操作(而不是像第一个示例那样崩溃)。

有关选项如何运作的说明,请阅读Apple's article