-1

我正在尝试在var初始化时创建一个而不分配值。我是新来的swift,来自Objective-c,我在使用包装器/解包器时遇到了麻烦。我的代码中有以下内容:

var elapsedTime : NSTimeInterval!

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

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

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

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

4

2 回答 2

1

这是一种特定于隐式展开的可选的行为。这 !在类型名称之后使其成为隐式展开的可选,例如使用 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
}
于 2015-08-20T02:16:31.157 回答
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这将编译,但如果没有值,它将在运行时崩溃。

这可能是一个编译器错误,因为-=可能与上一个示例等效,但会产生编译器错误。

于 2015-08-20T02:47:08.077 回答