我尝试创建var
时没有在初始化时分配值。我是swift
的新用户,来自Objective-c
,而且我在使用包装/解包器时遇到问题。我的代码中有以下内容:
var elapsedTime : NSTimeInterval!
self.elapsedTime -= (NSTimeInterval(hours) * 3600)
我在第二行收到以下错误:
Binary operator '-=' cannot be applied to operands of type 'NSTimeInterval!' and '(Double)'
我该怎么做才能解决这个问题,为什么我会收到错误?
答案 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
没有值,它将在运行时崩溃。
这可能是编译器错误,因为-=
或许应该等同于最后一个示例,而是产生编译器错误。