当我尝试展开var时,我收到错误

时间:2015-08-20 02:01:05

标签: ios swift wrapper forced-unwrapping

我尝试创建var时没有在初始化时分配值。我是swift的新用户,来自Objective-c,而且我在使用包装/解包器时遇到问题。我的代码中有以下内容:

var elapsedTime : NSTimeInterval!

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

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

  

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

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

2 个答案:

答案 0 :(得分:1)

这是隐式展开的可选项的特定行为。的!在类型的名称之后使它成为一个隐含的未包装的可选项,例如使用NSTimeInterval !.编译器将允许您尝试访问可选内部的值而不检查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的安全语法。

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

答案 1 :(得分:0)

您可能遇到了编译器错误。

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没有值,它将在运行时崩溃。

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