当我尝试解包 var 时,出现错误

When I try unwrapping a var, I get an error

我正在尝试创建一个 var,但未在初始化时分配值。我是 swift 的新手,来自 Objective-c,我在使用 wrapper/unwrapper 时遇到了问题。我的代码中有以下内容:

var elapsedTime : NSTimeInterval!

self.elapsedTime -= (NSTimeInterval(hours) * 3600)

我在第二行收到以下错误:

Binary operator '-=' cannot be applied to operands of type 'NSTimeInterval!' and '(Double)'

我应该怎么做才能解决这个问题,为什么我会收到错误消息?

这是一种特定于隐式解包可选的行为。这 !在类型名称之后使其成为隐式解包可选,例如 NSTimeInterval!。编译器会让你尝试访问可选中的值而不检查 nil。如果在运行时那里有一个 nil,你的程序就会爆炸。

出于某种原因,-= 不能与左侧的隐式解包可选一起应用。 NSTimeInterval 是 Double 的类型别名,所以我将使用一个简单的例子。

var time = 0.0
var dangerousTime: Double! = 15.0
time -= dangerousTime // works fine
dangerousTime = dangerousTime - time // works fine
dangerousTime -= time // errors out

隐式展开的可选值是危险的,你应该避免使用它们。无论如何,这可能会解决您的问题。从这里开始的几种可能方式:

在Swift中,你不需要Optional来声明一个没有初始化的变量。编译器不会让你使用它,直到你给它分配一个初始值。

var time: Double
var foo = time + 5 // error
time = 4.0
foo = time + 5 // success

您可能需要一个常规的旧 Optional 和使用 Optional 的安全语法。

var maybeTime: Double?
if let time = maybeTime {
    maybeTime = time - 42
}

您可能 运行 遇到编译器错误。

elapsedTime 声明为 Optional,这意味着它可能有值,如零,也可能没有值。

-= 运算符只有在 elapsedTime 有值时才有意义。

如果你想处理elapsedTime没有值的情况,你可以这样做:

if let elapsedTime = self.elapsedTime {
    self.elapsedTime = elapsedTime - (NSTimeInterval(hours) * 3600)
}
else {
    // self.elapsedTime has no value.  What do you want to do?
}

如果你只想假设 self.elapsedTime 总是有一个值,你可以这样做:

    let elapsedTime : NSTimeInterval = self.elapsedTime
    self.elapsedTime = elapsedTime - (NSTimeInterval(hours) * 3600)

这将编译,但如果 self.elapsedTime 没有值,它将在 运行 时崩溃。

这可能是一个编译器错误,因为 -= 也许应该等同于最后一个示例,但会产生编译器错误。