【发布时间】: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