我无法理解显式声明的字符串和隐式展开的可选字符串之间的区别。
例如,
如果我们显式初始化字符串,
let assumedString:String = "Test String"
print(assumedString)
给出输出
"Test String"
"Test String\n"
在操场上。
同样,如果我们隐式展开这样的可选字符串,
let assumedString:String! = "Test String"
print(assumedString)
输出相同
"Test String"
"Test String\n"
而且一旦我们使用'!'初始化时,其值不能为零。所以我们可以使用显式类型,对吗?
那我们为什么要用'!'这个概念呢(隐式展开可选字符串)。
请解释使用'!'的区别或用法如果可能的话,提供一个代码示例。
最佳答案
在您的示例中,您只使用let
常量。对于let
常数,您几乎看不到两者之间的区别。形势变了。
如您所知,类中的所有属性都必须初始化为初始值设定项中的某个值。可选属性是此规则的例外。默认情况下,nil
即无值。
我最常使用的隐式展开选项是当我有一个存储视图高度或任何与UI相关的内容的属性时。我总是把它们声明为隐含的未包装选项。例如
var myViewsHeight: CGFloat!
override func viewDidLoad() {
myViewsHeight = self.view.viewWithTag(1).frame.height
}
显然您无法在
init
中初始化该变量,因为在init
中,视图尚未布局!无法知道风景的高度。因为您知道它将在viewDidLoad
中初始化,所以您可以将它设为隐式展开选项。这样做的另一个优点是它使跟踪错误变得更容易。假设你的应用程序崩溃了,因为如果在viewDidLoad
中发生了什么事情,并且初始化myViewsHeight
的行没有执行,你会立即知道,因为你的应用程序崩溃了!您还将看到所有
IBOutlet
都是隐式展开的选项,原因相同-无法在init
处分配视图。