我是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()
}
答案 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
案例。