2017-07-14 31 views
2

我很困惑,即使textField.text是可選項,爲什麼label.text = textField.text行仍然有效。一般來說,我會寫爲:例我不必打開Swift可選項?

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 = "" 
    } 
} 
+4

您可以指定任意一個可選的;您可以爲可選項指定非可選項,但不能將可選項指定給非可選項。第三種情況是你必須打開包裝。 – vacawama

回答

3

UILabel text是一個可選String

UITextField text是可選的String

可選可以接受可選或非可選。

非可選只能接受非可選項。

你只需要打開一個可選的,當你需要一個非可選的。

2

由於vacawama指出:

您可以指定任意一個可選的;您可以將非可選項 分配給可選項,但您不能將可選項分配給不可選項的 。

因此,如果您想將其分配給非可選項,您需要展開可選項。

而打開一個可選項時,使用if let語句總是比較安全,該語句提取非可選版本的可選項並將其分配給變量以供進一步使用。

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)。這表達式會爲true,如果兩者都nil,或者兩者都包含相同的值。如果一個是nil而另一個包含一個值,或者兩者都包含不同的值,則會得到錯誤。

(需要注意的是自選不Comparable但是你不能使用a < b,例如,因爲它沒有規定如果nil > 0nil < 0。)

+1

問題無關與兩個出口隱含地展開自選。問題在於「UILabel」和「UITextField」的'text'屬性是可選的。 – rmaddy

+0

我想你是對的OP問的是文本屬性,但像'label.text'的表達是不合法的與「常規」自選和OP的代碼中包含了幾個這樣的表達,不會,如果'標籤編譯'和'textField'是「常規」選項。因此我認爲涵蓋隱含的解包選項很重要。 –

相關問題