【问题标题】:Value of optional type CGFloat? not unwrapped, did you mean to use ! or?可选类型 CGFloat 的值?没有打开,你的意思是用!或者?
【发布时间】:2015-05-22 10:37:13
【问题描述】:

有一个脉冲施加到一个球上。但是这个球在那个冲动之后一直在移动,但我希望它移动一点。所以这就是我正在尝试的:

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 ?

如何解决?

【问题讨论】:

标签: ios swift error-handling sprite-kit


【解决方案1】:

当使用可选项时,你总是应该使用if let 解包它们,因为如果你使用? 并且值为nil,代码将不会执行,并且你不会知道有一个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 !
}

【讨论】:

  • 这是否会做正确的事情取决于bal.physicsBody是一个类还是一个结构。如果它是一个结构,这将获取一个本地副本并对其进行更改,在 if 之外没有任何影响。
  • 我假设它是一个类,还是不是?
  • 不知道,代码没有说明(尽管我猜你可以假设它是 sprite kit 中的标准属性)。但通常需要注意一些事情。
【解决方案2】:

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

在这个特定的示例中,您有一个可选的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 有一个初始化器,它采用相同的参数(如上所示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2015-12-29
    相关资源
    最近更新 更多