我很困惑为什么label.text = textField.text
行有效,即使textField.text
是可选的。通常我会把它写成:
if let text2 = textField.text {
label.text = text2
}
上面的代码工作正常但为什么label.text = textField.text
也可以正常工作?我认为打开选项是必须的吗?我何时必须使用if let
语法,何时不必使用?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
label.text = ""
}
@IBAction func setTextButtonTapped(_ sender: Any) {
label.text = textField.text
}
@IBAction func clearTextButtonTapped(_ sender: Any) {
textField.text = ""
label.text = ""
}
}
答案 0 :(得分:3)
UILabel text
是可选的String
。
UITextField text
是可选的String
。
可选项可以接受可选项或非可选项。
非可选项只能接受非可选项。
当您需要非可选项时,您只需打开一个可选项。
答案 1 :(得分:2)
正如vacawama所指出的那样:
您可以为可选项指定可选项;你可以分配一个 非可选的可选项,但您无法为a分配可选项 非可选的。
因此,如果您想将其分配给非可选项,则需要打开可选项。
要打开一个可选项,使用if let
语句总是更安全,它会提取可选的非可选版本并将其分配给变量以供进一步使用。
答案 2 :(得分:1)
听起来你并不熟悉隐式解包的选项。
label
是一个隐式展开的UILabel
,textField
是一个隐式展开的UITextField
那是宣言中的!
@IBOutlet weak var label: UILabel!
的装置。
因此,在不打开它的情况下将内容分配给它是合法的:
label.text = "some string"
然而,这不一定是安全。如果label
为零,则该代码将崩溃。
如果label
是正常的可选项:
@IBOutlet weak var label: UILabel?
您必须使用以下代码:
label?.text = "some string"
默认情况下,Xcode将出口设置为隐式展开的选项,因为如果没有连接插座,让代码崩溃会让你知道出错是很好的。
另一部分是可以将2个选项相互比较:
如果你有
var a: Int?
var b: Int?
测试a == b
是合法的。 (正式提出,Optionals
是Equatable
。如果两者都是nil
,或者两者都包含相同的值,那么该表达式将评估为true。如果一个是nil
而另一个包含值,或者两者都包含不同的值,那么您将获得错误。
(请注意,选项不是Comparable
。例如,您无法使用a < b
,因为它未定义nil > 0
或nil < 0
。 )