当我尝试解包 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
没有值,它将在 运行 时崩溃。
这可能是一个编译器错误,因为 -=
也许应该等同于最后一个示例,但会产生编译器错误。
我正在尝试创建一个 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
没有值,它将在 运行 时崩溃。
这可能是一个编译器错误,因为 -=
也许应该等同于最后一个示例,但会产生编译器错误。