为什么我们需要在创建对象时对 dataType 进行 foreUnwrap? Swift 5

why do we need to foreUnwrap the dataType while creating an object? Swift 5

每当我在 ViewController class 中创建任何对象时上网或在线检查项目时,我都会在数据类型末尾看到感叹号 (!),这是为什么?例如:@IBOutlet weak var Label:UILabel! 那为什么是'!'标记或者为什么我们要强制展开它? 而且当我删除它时,它会报错,我们也可以这样写 @IBOutlet weak var Label=UILabel() 那我们为什么不使用它呢?

你需要一步一步去了解事情才能得到答案。

  1. @IBOutlet:这是一个 属性 包装器,告诉 Xcode 将故事板上的元素与 .swift 文件中的元素连接起来。
  2. !标记:推荐使用force-unwrap这个东西,因为当.swift文件需要实例的时候,肯定能在storyboard中找到连接的元素。我们也可以写@IBOutlet weak var Label: UILabel?在这种情况下,实例 Label 是可选的。
  3. @IBOutlet weak var Label=UILabel():在这种情况下,实例 Label's 值在初始化后立即被 UILabel() 覆盖。 Label = UILabel() 之后的 @IBOutlet weak var Label!Label 不是同一个实例。

@IBOutlet weak var label: UILabel相当于写var label: UILabel。因此 i-val 没有初始值并且 Swift 不允许这样做。在 Swift 中,您要么必须为变量赋值,要么使其成为 optional/unwrapped 以显式处理 nil 值。而且,当您使用 @IBOutlet 解包实例时,您可以稍后将其与 ? 一起使用,例如 label?.text = "Some text".

因此,我们被迫使用 !? 作为出口来明确地使变量可选,就像其他变量声明一样。而且我们在声明后不使用 = UILabel(),因为它会覆盖从 Storyboard 创建的实例(使用笔尖中的 NSCoder/Coder 初始化)。