1

我在操场上运行这些代码,但出现编译错误

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

4

1 回答 1

3

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

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

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

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

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

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

let bOfA = a.b
bOfA.b = 3

瞧!问题解决了!

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

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


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

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

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

  1. Swift 安全地展开可选字符串和整数
  2. https://learnappmaking.com/swift-optionals-how-to/
  3. https://forums.developer.apple.com/thread/45469
于 2020-03-06T16:01:40.263 回答