2017-07-14 9 views
2

textField.textはオプションですが、なぜlabel.text = textField.text行が機能するのか混乱しています。上記のコードは正常に動作しますが、なぜ、あまりにもlabel.text = textField.text細かい作業を行いケーススウィフトオプションをアンラップする必要はありませんか?

if let text2 = textField.text { 
    label.text = text2 
} 

:として一般的に私はそれを書くだろうか?私はそれがオプションのラップを解除する必要があると思った? 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

あなたは、オプションにオプションを割り当てることができます。オプションではないオプションに代入することはできますが、オプションではなく非オプションに代入することはできません。 3番目のケースは、アンラップする必要がある場合です。 – vacawama

答えて

3

UILabel textは任意のStringです。

UITextField textは、オプションでStringです。

オプションでは、オプションまたは非オプションを受け入れることができます。

非オプションは非オプションを受け入れることができます。

オプションではないオプションが必要な場合にのみ、オプションのラップを解除する必要があります。

2

vacawamaが指摘したように:あなたはオプションにオプションを割り当てることができます

。オプションで非標準の を割り当てることはできますが、オプションの非標準の にはオプションを割り当てることはできません。

したがって、オプションでないものに割り当てる場合は、オプションをアンラップする必要があります。

if letステートメントを使用すると、オプションのワイプを解除することができます。このステートメントは、オプションの非オプションバージョンを抽出し、それを変数に割り当てて後で使用することができます。

1

暗黙のうちにアンラップされたオプションに慣れていないようです。

labelは、暗黙的に開封されたUILabelあり、そしてtextFieldは宣言

@IBOutlet weak var label: UILabel! 

手段で何!だことUITextField

暗黙的に開封されています。

したがって、それはそれをアンラップすることなく、それに物事を割り当てるには、法的です:

label.text = "some string" 

しかし、それは必ずしも安全ではありません。 labelがnilの場合、そのコードはクラッシュします。

labelの場合は、通常のオプションでした:

@IBOutlet weak var label: UILabel? 

次のようなコードを使用する必要があると思います:

label?.text = "some string" 

Xcodeのコンセントであればあるため、デフォルトで暗黙的に開封されたoptionalsとしてのコンセントを設定します接続されていない場合は、コードがクラッシュして何かが間違っていることを知っておくとよいでしょう。あなたはそれがa == bをテストするために法的だ

var a: Int? 
var b: Int? 

をお持ちの場合は

本の別の部分は、それがお互いに2つのoptionalsを比較しても大丈夫だということです。 (正式には、OptionalsEquatableです。)この式は、両方がnilの場合、または両方が同じ値を含む場合はtrueに評価されます。一方がnilで、他方が値を含む場合、または両方に異なる値が含まれている場合は、falseになります。

nil > 0またはnil < 0場合、それは定義されていないので、あなたは、例えば、a < bを使用することができませんでしたoptionalsしかしComparableないことに注意してください。。)

+1

質問は、暗黙のうちにアンラップされたオプションである2つのアウトレットとは関係ありません。問題は、 'UILabel'と' UITextField'の 'text'プロパティがオプションであるという事実です。 – rmaddy

+0

OPがテキストプロパティについて質問しているのは間違いないと思いますが、 'label.text'のような式は" regular "オプションでは正しくありません.OPのコードには、' label 'と' textField'は「通常の」オプションです。したがって、私は暗黙のうちにアンラップされたオプションを扱うことが重要だと思います。 –

関連する問題