我无法理解显式声明的字符串和隐式展开的可选字符串之间的区别。
例如,
如果我们显式初始化字符串,

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处分配视图。

10-07 13:08