Ios Swift错误:可选类型的值';双倍?';未拆开

Ios Swift错误:可选类型的值';双倍?';未拆开,ios,iphone,xcode,swift,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

我是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()
                }
让lvt=self?.lastVibrationTime
让delta=self!。三角洲
让sens=self!。震动敏感性
let time:Double=CACurrentMediaTime()
//error位于'lvt'上,表示:error:(37,27)可选类型'Double'的值未展开;你想用“!”吗还是“?”?
如果时间-lvt>delta&&data.userAcceleration.x
所有选项都需要打开包装。 所以
lvt
应该变成
lvt

警告打开没有值的可选项将引发异常。因此,确保你的lvt不是零可能是个好主意

if (lvt != nil)

当您编写
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...
}
这一行:

let lvt = self?.lastVibrationTime
您正在确认的
self
是可选的。因此,如果它是
nil
,那么
lvt
将是nil;如果
self
不是
nil
,则您将获得最后一次振动时间。由于这种模糊性,
lvt
不是
Double
类型,而是可选的
Double?

如果您确定
self
不会为零,则可以强制将其展开:

let lvt = self!.lastVibrationTime // lvt is a Double
如果
self
为零,则应用程序将在此崩溃

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

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

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

在if语句中,您可以尝试将
lvt
更改为
lvt猜测“lastVibrationTime”声明为“可选”。这意味着它可能是零,所以您需要在使用前将其打开。@ztan它起作用了,但这意味着什么?@gagarwal var last振动时间:Double=0//它是可选的吗?不,但既然您使用“self”作为可选的,它不能是,那么请尝试在self之后删除“?and!”,您就可以了。为什么Int可以是可选的呢?原因很多。主要是因为以前从未设置过该值。在你的情况下,可能没有最后的振动时间。一切都可以选择。甚至选项也可以是可选的:-)
self?.lastVibrationTime
self!之间的区别是什么!。lastVibrationTime
这是swift语言的基础,当使用
self?
时,您说只有当
self
为非nil时才分配lvt变量,这就是为什么在您的示例中使用
self时lvt是可选的仅当您确定变量永远不会为零时。