案件我没有打开Swift可选项吗?

时间:2017-07-14 23:34:27

标签: ios swift

我很困惑为什么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 = ""
    }
}

3 个答案:

答案 0 :(得分:3)

UILabel text是可选的String

UITextField text是可选的String

可选项可以接受可选项或非可选项。

非可选项只能接受非可选项。

当您需要非可选项时,您只需打开一个可选项。

答案 1 :(得分:2)

正如vacawama所指出的那样:

  

您可以为可选项指定可选项;你可以分配一个   非可选的可选项,但您无法为a分配可选项   非可选的。

因此,如果您想将其分配给非可选项,则需要打开可选项。

要打开一个可选项,使用if let语句总是更安全,它会提取可选的非可选版本并将其分配给变量以供进一步使用。

答案 2 :(得分:1)

听起来你并不熟悉隐式解包的选项。

label是一个隐式展开的UILabeltextField是一个隐式展开的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是合法的。 (正式提出,OptionalsEquatable。如果两者都是nil,或者两者都包含相同的值,那么该表达式将评估为true。如果一个是nil而另一个包含值,或者两者都包含不同的值,那么您将获得错误。

(请注意,选项不是Comparable。例如,您无法使用a < b,因为它未定义nil > 0nil < 0。 )