我在操场上运行这些代码,但是出现编译错误
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
欢迎使用Stackoverflow。让我们尝试一个接一个地回答您的问题。
这两者之间有什么区别?
a.b.b = 3
和print(a.b.b)
如果这是您的意思,则第一个会导致Playground出现错误,
表达式无法解析,未知错误
然后实际上没有区别。但是,如果您想知道为什么会这样,那一定是Playground问题。因为此表达式不会在Xcode(项目)中引起编译时错误。
要在Playground中解决该问题,您需要像这样细分表达式:
let bOfA = a.b
bOfA.b = 3
Voila!问题解决了!
此外,此问题可能与Xcode错误有关:
编译器无法合理地对该表达式进行类型检查时间;尝试将表达式分解为不同的子表达式
我什么时候应该使用'!'明确地显示,并且在不需要时?
如果确定对象是具有值,则使用!
。 !
自动打开对象的包装,而无需检查它是否为零。何时不需要?好吧,您不应该练习强制展开。阅读有关安全展开选项的信息,以了解更多信息。那里有很多资源。