隐式展开可选值并在 nil 时使用它的值
Implicitly unwrapped optional values and using its value if nill
Apple 文档说明了以下关于隐式解包可选的内容。
NOTE
If an implicitly unwrapped optional is nil and you try to access its
wrapped value, you’ll trigger a runtime error. The result is exactly
the same as if you place an exclamation mark after a normal optional
that does not contain a value.
到目前为止,还不错。但是如果我们看到任何 UI 属性的引用都是隐式解包可选的。我一直在这样做 -
@IBOutlet weak var lbleemsx: UILabel!
@IBOutlet weak var nmtxtfld: UITextField!
override func viewDidLoad()
{
super.viewDidLoad()
lbleemsx.text = nmtxtfld!.text
}
现在,如果用户没有在文本字段中输入任何内容,nmtxtfld!.text
的值为 nil,因为我在我的代码中使用了它的值,那么它应该 return 错误,但它没有吨。为什么会这样?
你有点糊涂了。在这种情况下,它是 nmtxtfld
- UITextField 实例,它是隐式解包的可选对象。 属性 不是 nil,因为它是在您从 NIB 文件或故事板场景实例化视图控制器时设置的。如果您只是在没有 NIB 或故事板的情况下分配了一个新的视图控制器实例,那么 nmtxtfld
将为 nil,并且当您尝试访问它时会出现运行时异常。
访问 nmtxtfld.text
不会出现运行时异常的原因是,正如其他人在评论和答案中解释的那样,当 UITextField 为空时,它是 text
属性 不是零,它是一个空字符串 ""
text
属性 是可选的,因此它 可以 为零,但在这种情况下,您将其分配给 text
UILabel
的 属性,其 text
属性 也是可选的,所以即使 nmtxtfld.text
是 nil分配是可以的,因为你可以将 nil 分配给一个可选的。
如果 nmtxtfld.text
是 nil 而你说了类似 let aString=nmtxtfld.text!
那么你会得到一个运行时异常,因为你已经明确地解包了一个 nil。
Apple 文档说明了以下关于隐式解包可选的内容。
NOTE
If an implicitly unwrapped optional is nil and you try to access its wrapped value, you’ll trigger a runtime error. The result is exactly the same as if you place an exclamation mark after a normal optional that does not contain a value.
到目前为止,还不错。但是如果我们看到任何 UI 属性的引用都是隐式解包可选的。我一直在这样做 -
@IBOutlet weak var lbleemsx: UILabel!
@IBOutlet weak var nmtxtfld: UITextField!
override func viewDidLoad()
{
super.viewDidLoad()
lbleemsx.text = nmtxtfld!.text
}
现在,如果用户没有在文本字段中输入任何内容,nmtxtfld!.text
的值为 nil,因为我在我的代码中使用了它的值,那么它应该 return 错误,但它没有吨。为什么会这样?
你有点糊涂了。在这种情况下,它是 nmtxtfld
- UITextField 实例,它是隐式解包的可选对象。 属性 不是 nil,因为它是在您从 NIB 文件或故事板场景实例化视图控制器时设置的。如果您只是在没有 NIB 或故事板的情况下分配了一个新的视图控制器实例,那么 nmtxtfld
将为 nil,并且当您尝试访问它时会出现运行时异常。
访问 nmtxtfld.text
不会出现运行时异常的原因是,正如其他人在评论和答案中解释的那样,当 UITextField 为空时,它是 text
属性 不是零,它是一个空字符串 ""
text
属性 是可选的,因此它 可以 为零,但在这种情况下,您将其分配给 text
UILabel
的 属性,其 text
属性 也是可选的,所以即使 nmtxtfld.text
是 nil分配是可以的,因为你可以将 nil 分配给一个可选的。
如果 nmtxtfld.text
是 nil 而你说了类似 let aString=nmtxtfld.text!
那么你会得到一个运行时异常,因为你已经明确地解包了一个 nil。