Ios 可选类型CGFloat的值?没有打开包装,你是想用它吗!或

Ios 可选类型CGFloat的值?没有打开包装,你是想用它吗!或,ios,swift,error-handling,sprite-kit,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?.vel

球上有一种冲动。但这个球在冲动之后一直在移动,但我希望它移动一点。下面是我正在尝试的:

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 ?

如何修复?

在使用选项时,如果让打开,则始终应使用
打开它们,因为如果使用
且值为零,则代码将不会执行,并且您将不知道存在零值

像这样使用它:

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 !
}

考虑到你最近问了一个类似的问题,你真的需要花一些时间来理解期权,因为你会不断遇到这类问题。你需要了解什么是可选的,以及处理它们的不同技术。试着阅读并开始

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

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
有一个采用相同参数的初始值设定项(如上所示)。

这与您的基本相同。这是否正确取决于
bal.physicsBody
是类还是结构。如果它是一个结构,这将获取一个本地副本并对其进行更改,在
If
之外没有任何影响。我认为它是一个类,还是不是?不知道,代码没有声明(尽管我猜如果它是sprike kit中的标准属性,您可以假设它是)。但总的来说需要注意一些事情。