【问题标题】:When I try unwrapping a var, I get an error当我尝试解开 var 时,出现错误
【发布时间】:2023-04-08 09:57:02
【问题描述】:

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

var elapsedTime : NSTimeInterval!

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

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

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

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

【问题讨论】:

  • 发布整个代码...几小时?

标签: ios swift wrapper forced-unwrapping


【解决方案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
}

【讨论】:

  • 访问时是否应该使用self
  • "self" 只是在类或结构的实例方法中可用的标识符。您可以在实例方法中访问实例变量,而无需显式使用 self。如果您在静态方法或顶级函数中,则没有 self.这有点个人风格的问题。但是,如果您将实例成员传递给闭包,编译器将要求您使用 self 来访问它。
  • 感谢您的解释和惊人的回答!当我尝试创建 var elapsedTime : NSTimeInterval 时(即使根本没有在代码中使用它)我在类名处收到错误:Class 'myClassName' has not initializers
  • 需要更多上下文。编辑您的问题或使用最小、完整且可验证的示例创建新问题。 stackoverflow.com/help/mcve
  • 感谢您的回答!我现在有一个不同的问题。我能请你回答,我将不胜感激! stackoverflow.com/questions/32127138/…\
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2022-06-14
    • 2022-01-15
    • 2011-07-12
    • 2011-06-02
    • 2020-02-11
    相关资源
    最近更新 更多