关于快速可选链接的一个小问题

问题描述 投票:1回答: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

swift optional optional-chaining
1个回答
0
投票

欢迎使用Stackoverflow。让我们尝试一个接一个地回答您的问题。

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

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

表达式无法解析,未知错误

然后实际上没有区别。但是,如果您想知道为什么会这样,那一定是Playground问题。因为此表达式不会在Xcode(项目)中引起编译时错误。

要在Playground中解决该问题,您需要像这样细分表达式:

let bOfA = a.b
bOfA.b = 3

Voila!问题解决了!

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

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


我什么时候应该使用'!'明确地显示,并且在不需要时?

如果确定对象是具有值,则使用!!自动打开对象的包装,而无需检查它是否为零。何时不需要?好吧,您不应该练习强制展开。阅读有关安全展开选项的信息,以了解更多信息。那里有很多资源。

    Swift safely unwrapping optinal strings and ints
  1. https://learnappmaking.com/swift-optionals-how-to/
  2. https://forums.developer.apple.com/thread/45469
© www.soinside.com 2019 - 2024. All rights reserved.