Swift错误:可选类型'Double?'的值没有打开

时间:2015-03-31 16:42:44

标签: ios iphone xcode swift

我是Swift的新手,这是什么错误:

let lvt=self?.lastVibrationTime
let delta=self!.deltaTime
let sens=self!.shakeSensitivity
let time:Double = CACurrentMediaTime()

//error is on `lvt` and says : Error:(37, 27) value of optional type 'Double?' not unwrapped; did you mean to use '!' or '?'?
if time - lvt > delta && data.userAcceleration.x < sens {
                    println("firmly shaken!")
                    self?.vibrateMe()
                }

3 个答案:

答案 0 :(得分:5)

当你使用let lvt=self?.lastVibrationTime编写self?时你的lvt变量是可选的,你必须在使用它之前解开它,你有很多解决方案来解决这个错误:

1. let lvt = self?.lastVibrationTime ?? 5 // 5 is the default value, you can use the value you want

2. let lvt = self!.lastVibrationTime

3. You can unwrap the value before use it:
if let lvt = self?.lastVibrationTime {
    // your code here...
}

答案 1 :(得分:3)

所有选项都需要打开。 因此lvt应该成为lvt!

谨慎之词展开没有值的可选项会抛出异常。所以确保你的lvt不是零可能是个好主意。

if (lvt != nil)

答案 2 :(得分:1)

这一行:

let lvt = self?.lastVibrationTime

您承认self是可选的。因此,如果它是nil,则lvt将为零;如果self不是nil,那么您将获得最后的振动时间。由于这种歧义,lvt不是Double类型,而是可选的,Double?

如果您确定self不会为零,您可以强行打开它:

let lvt = self!.lastVibrationTime // lvt is a Double

如果self为零,应用程序将在此处崩溃。

为安全起见,您可以使用可选绑定来检查值:

if let lvt = self?.lastVibrationTime {
  // do the comparison here
}

这意味着如果你有一些代码可以在nil的情况下执行,那么你可能需要一个else案例。