質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1253閲覧

アンラップされているのにif let文内の処理が実行される

vlb

総合スコア109

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/01/05 08:57

編集2019/01/20 23:29

18行目でtextField.textnilを代入したのにも関わらず,if let文内に記載しているprint("not nil")が実行されてデバックエリアにnot nilが表示されるのですが,なぜでしょうか.

swift

1import UIKit 2 3class ViewController: UIViewController, UITextFieldDelegate { 4 5 @IBOutlet weak var inputText: UITextField! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 inputText.delegate = self 12 } 13 14 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 15 16 textField.resignFirstResponder() 17 18 textField.text = nil 19 20 if let _ = textField.text { 21 print("not nil") 22 } 23 return true 24 } 25}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

確かにnilを設定したのにnilにならないのはおかしな挙動だなと思ってちょっと調べてみました。

すると、次のURLで同じ質問がありました。

https://stackoverflow.com/questions/42861115/why-is-uitextfield-text-an-optional

これは仕様なのだという意見と、バグだという意見の2つがありますが、いずれにしても、
こういう挙動をする(UITextFieldのtextプロパティはnilを設定してもnilにならない)
ものだということです。Appleがバグだと認めたら、将来変更になるかもしれません。

私の意見は、歴史的な経緯(Objective-Cとの互換性)からUITextFieldの
textプロパティはオプショナル型にする必要があるものの、Swiftでは
それをオプショナル型にしてnilにできることにメリットはないので、
nilを設定してもnilにならないという特殊な仕様にして安全方向に倒しているのだと
思います。
(おそらくtextプロパティのwillSetでnilをセットしようとしているかどうか
判定して、nilならセットしないようにしているのだろうと思います。)

ちなみに、UITextFieldではなく、UITextViewやUISearchBarのtextプロパティも
同じくnilになりません。

しかし、次のように独自クラスを作って

swift

1class TestClass { 2 var text:String? = "" 3}

次のようにした場合は

swift

1 let textField = TestClass() 2 print(textField.text!) 3 textField.text = nil 4 if let _ = textField.text { 5 print("not nil") 6 }

textField.textnilになります。

つまり、普通に var text:String? = ""と定義したらnilになるけど
UITextField、UITextView、UISearchBarのtextプロパティは
特殊な処理が行われていて、nilにならないように作られているのだと思います。

投稿2019/01/05 16:17

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

swift

1import UIKit 2 3class ViewController: UIViewController, UITextFieldDelegate { 4 5 @IBOutlet weak var inputText: UITextField! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 inputText.delegate = self 12 } 13 14 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 15 16 textField.resignFirstResponder() 17 18 textField.text = "" 19 print(textField.text) // -> Optional("") 20 21 textField.text = "hoge" 22 print(textField.text) // -> Optional("hoge") 23 24 textField.text = nil 25 print(textField.text) // -> Optional("") 26 27// if let _ = textField.text { 28 if let text = textField.text, !text.isEmpty { 29 print("not nil") 30 } else { 31 print("empty") 32 } 33 34 return true 35 } 36 37} 38

投稿2019/01/05 11:09

izkn

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問