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

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

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

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

Swift

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

Q&A

解決済

1回答

576閲覧

swiftのオプショナルについて。

mana_mana419

総合スコア27

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/07/18 14:38

swiftでアプリを製作中なのですが、下のプログラミングのなかで何故そこにオプショナルがあるのか?と感じたため投稿させていただきました。

swift

1import UIKit 2 3class AddViewController: UIViewController,UITextFieldDelegate { 4 5 var array = [String]() 6 7 @IBOutlet var textField: UITextField! 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 textField.delegate = self 14 // Do any additional setup after loading the view. 15 } 16 17 @IBAction func add(_ sender: Any) { 18 19 if UserDefaults.standard.object(forKey: "todo") != nil{ 20 array = UserDefaults.standard.object(forKey: "todo") as! [String] 21 } 22 23 array.append(textField.text!) 24 UserDefaults.standard.set(array, forKey: "todo") 25 26 self.navigationController?.popViewController(animated: true) 27 } 28 29 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 30 31 textField.resignFirstResponder() 32 33 return true 34 } 35 /* 36 // MARK: - Navigation 37 38 // In a storyboard-based application, you will often want to do a little preparation before navigation 39 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 40 // Get the new view controller using segue.destination. 41 // Pass the selected object to the new view controller. 42 } 43 */ 44 45}

上記のプログラミングのなかの

swift

1array.append(textField.text!) 2```のtextに何故 オプショナルの!が付いているのかわかりません。 3もしわかるかたがいらっしゃいましたら、ぜひ教えていただきたいです。 4よろしくお願いいたします。

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

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

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

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

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

fuzzball

2019/07/18 23:52

変数宣言時の ! と アンラップ時の ! は意味が違いますが、そこを理解した上での質問でしょうか? (「何故 オプショナルの!が付いているのかわかりません」という文章から、理解出来ていないのかなと思いました)
mana_mana419

2019/07/19 17:18

いつも見ていただき、コメントありがとうございます! 変数宣言時の!は値にnilがある可能性もある。ただ変数宣言時に!を使うとアンラップ時にまた!を書かなくて済む。変数宣言時に?を使った場合はアンラップ時に!を書かなければいけないという認識を持っています。 これで正しいでしょうか?
guest

回答1

0

ベストアンサー

UITextField の text は String? となっておりオプショナル型です。
なので nil の可能性があります。
array は [String] で宣言されていて nil を許容しませんので
強制アンラップ(!)で String にして append しています。

参考:
https://developer.apple.com/documentation/uikit/uitextfield/1619635-text

投稿2019/07/18 14:56

編集2019/07/18 14:57
TakuyaAso

総合スコア1361

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

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

TakuyaAso

2019/07/18 15:01 編集

nil の可能性がある場合は強制アンラップを使うとクラッシュの恐れがあるので, if let や guard let などを使って nil でないのを確認してから処理をすることが多いです。 もちろん絶対に nil の可能性がない場合は強制アンラップを使ってもいいです。
mana_mana419

2019/07/19 17:22

なるほど! .textプロパティはnilの可能性もあるためstring?型。 しかし今回適応させたいarrayはstring型で宣言をしているため、そこに合わせるためアンラップをしてあげなければいけないということですね!
TakuyaAso

2019/07/19 17:24

はい,そうですね! .textプロパティはnilの可能性もあるためstring?型。は逆ですね。 .text は String? 型なので nilの可能性がある。
mana_mana419

2019/07/19 17:34 編集

あと別のコードなのですが、 result.text = mailaddress.text! + password.text!というコードを見かけたことがありました。 result.textはUILabel!で宣言されていて、mailaddress.textとpassword.textはUITextField!で宣言がされていました。 先程教えていただいたことを踏まえた上でこのコードを見たのですが、 result.textの.textもstring?型のはずなのでmailaddress.textにもpassword.textにも!は必要ないのでは?と感じました。 また質問をしてしまいすいません、、、
TakuyaAso

2019/07/20 15:42

+ があるからですね。片方だけだといけますね。 こういうエラーが出ます。 Binary operator '+' cannot be applied to two 'String?' operands
mana_mana419

2019/07/25 18:08

.textを+と一緒に使う時には!が必要なのですね! とても勉強になりました! 沢山教えていただき、最後まで丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問