【问题标题】:A little question about optional chaining in swift关于 swift 中的可选链接的一个小问题
【发布时间】:2020-06-19 09:11:38
【问题描述】:

我在操场上运行这些代码,但我得到一个编译错误

a.b.b = 3

但它在下一行运行良好。这两者有什么区别?我什么时候应该使用“!”明确的,什么时候不需要?

代码如下:

class A {
    var a = 1
    var b = B()
}

class B {
    var b = 2
}

var a:A! = A()

a.b.b = 3 // will get a compile error
print(a.b.b) // runs well, print 2
a?.b.b = 3 // runs well
print(a.b.b) // runs well, print 3

【问题讨论】:

  • 您的代码运行良好。您遇到了什么错误?
  • 您看到的问题可能是由 Playgrounds 中的问题引起的。如果你在别处编译它运行良好。也就是说,您几乎可以肯定不应该使用隐式展开的可选项。它们用于解决某些后期初始化问题,并且在某些情况下用于处理未注释的 Objective-C 桥接。您在此处描述的那种情况几乎肯定不能正确使用它们(我不知道它们适合作为局部变量的任何情况)。
  • 在您的代码中,感叹号和类型注释本身都不是必需的。你让事情变得更糟:你将非可选注释为(隐式展开)可选。尽可能避免选项。并且仅在编译器要求您这样做时才对类型进行注释。
  • @Alladinian 也许这只是操场上的一个问题。我认为它们是相同的,所以在遇到错误时我会感到困惑。感谢您的回复。
  • @RobNapier 感谢您的回复。看来操场上的问题让我一头雾水。

标签: swift optional optional-chaining


【解决方案1】:

欢迎来到 Stackoverflow。让我们尝试一一回答您的问题。

这两者有什么区别? a.b.b = 3print(a.b.b)

如果这是你的意思,第一个会导致 Playground 出错,

表达式解析失败,未知错误

那么实际上没有区别。但是,如果您想知道为什么会发生这种情况,那一定是 Playground 问题。因为这个表达式不应该在 Xcode(项目)中导致编译时错误。

要在 Playground 中解决这个问题,您需要分解表达式,如下所示:

let bOfA = a.b
bOfA.b = 3

瞧!问题解决了!

此外,这个问题可能与 Xcode 错误有关:

编译器无法合理地对该表达式进行类型检查 时间;尝试将表达式分解为不同的子表达式


什么时候应该使用“!”明确的,什么时候不需要?

如果您确定您的对象具有价值,则使用 !! 自动解包对象,无需检查它是否为 nil。

什么时候不需要?好吧,你不应该尽可能地练习强制展开。阅读安全展开选项以获取更多信息。有很多关于它的资源。

  1. Swift safely unwrapping optinal strings and ints
  2. https://learnappmaking.com/swift-optionals-how-to/
  3. https://forums.developer.apple.com/thread/45469

【讨论】:

  • 谢谢。最让我困惑的是第一个答案。所以这似乎是一个操场问题。其他答案也非常有用。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
相关资源
最近更新 更多