Swift错误:可选类型'Double?'的值未解包

3

我是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()
                }

1
在你的if语句中,你可以尝试将lvt更改为lvt! - ztan
猜测"lastVibrationTime"被声明为"optional"。 这意味着它可能为空,因此您需要在使用之前取消包装它。 - gagarwal
@ztan 它起作用了,但是它意味着什么? - AVEbrahimi
@gagarwal var lastVibrationTime : Double = 0 // 这是可选的吗? - AVEbrahimi
1
不,但是由于您将“self”用作可选项,这是不可能的,因此请尝试删除“self”后面的“?”和“!”符号,那么一切都会很好。 - gagarwal
3个回答

5

当你使用 self?时,当你写下let lvt=self?.lastVibrationTime你的变量 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
self?.lastVibrationTimeself!.lastVibrationTime 之间的区别是什么? - AVEbrahimi
这是 Swift 语言的基础,当使用 self? 时,你表示只有在 self 不为 nil 时才会分配 lvt 变量,这就是为什么在你的示例中 lvt 是可选的。当使用 self! 时,你表示你确定 self 不为 nil,你应该只在确定变量永远不会为 nil 时使用 ! - bsarr007

4

所有可选项都需要进行解包处理。所以lvt应该变成lvt!

注意事项:解包一个没有值的可选项将抛出异常。因此,最好确保lvt不为nil

if (lvt != nil)

为什么Int可以是可选的? - AVEbrahimi
有很多原因。主要是因为该值以前可能从未被设置过。在您的情况下,也许根本没有上次振动时间。 - Shamas S
一切都可以是可选的。甚至可选项也可以是可选的 :-) - gnasher729

1

使用这行代码:

let lvt = self?.lastVibrationTime

您已经确认self是可选的。因此,如果它是nil,那么lvt也将是nil;如果self不是nil,那么您将得到最后一次振动时间。由于存在这种歧义,lvt不是Double类型,而是一个可选的Double?

如果您确定self不会为nil,则可以强制解包它:

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

如果self为nil,应用程序将在此处崩溃。
为了安全起见,您可以使用可选绑定来检查该值:
if let lvt = self?.lastVibrationTime {
  // do the comparison here
}

这意味着如果你在nil的情况下需要执行一些代码,你可能需要在这里加上一个else语句块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接