可选类型CGFloat的值?没打开,你的意思是用!要么?

时间:2015-05-22 10:37:13

标签: ios swift error-handling sprite-kit

对球有一种冲动。但是这个球在这种冲动之后继续前进,但是我希望它能够移动一下。所以我正在尝试这里:

var impulse:CGFloat = 0.22 // bal impulse

申请冲动:

bal.physicsBody?.applyImpulse(CGVectorMake(50 * impulse, 50 * impulse))

试图限制运动:

  if bal.physicsBody?.velocity.dx > impulse{
        bal.physicsBody?.velocity.dx = bal.physicsBody?.velocity.dx - impulse
    }

但最后一段代码却出现了这个错误:

Value of optional type CGFloat? not unwrapped, did you mean to use ! or ?

如何解决?

2 个答案:

答案 0 :(得分:1)

当使用选项进行处理时,你总是应该使用if let解包它们,因为如果使用?并且值为nil,则代码将不会执行,并且你不会知道有零值。

像这样使用:

var impulse:CGFloat = 0.22 // bal impulse

if let body = bal.physicsBody {

     body.applyImpulse(CGVectorMake(50 * impulse, 50 * impulse))

     if body.velocity.dx > impulse {
          body.velocity.dx = body.velocity.dx - impulse
     }
}
else
{
   // bal.physicsBody is nil !
}

答案 1 :(得分:1)

鉴于你最近问了一个类似的问题,你真的需要花一些时间来理解选项,因为你会不断遇到这些问题。您需要了解哪些选项是什么,以及处理它们的不同技术。尝试阅读thisthis开始。

在此特定示例中,您有一个可选的velocity,因为您通过另一个可选的physicsBody通过“可选链接”(?.)访问它。因此,要在其上执行-之类的操作,您需要使用可选技术。对于带有额外if let子句的where来说,这看起来很好:

if let v = bal.physicsBody?.velocity where v.dx > impulse {
    bal.physicsBody?.velocity = CGVector(dx: v.dx - impulse, dy: v.dy)
}

注意,可选的链接可以“分配”,这就是bal.physicsBody?.velocity =有效的原因。

此外,无需使用CGVectorMake。与Objective-C不同,CGVector有一个初始值设定项,它采用相同的参数(如上所示)。