2014-10-07 63 views
1

我有一个工作和编译Swift游戏,我更新到新的XCode之前,突然出现了很多错误。这里有两个我无法修复。Swift:SKNode应该有可选的类型,可选成员没有成员

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#术语?

回答

2

这将工作,假设node.scene从未nil,并node.parent从未nil

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

相关问题