在我更新到新的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#术语中是什么?
答案 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。