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

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

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

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

Q&A

解決済

3回答

1307閲覧

textFieldが空の時はどうSwitch分岐するのか?教えて欲しい

KTH

総合スコア86

Swift

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

0グッド

0クリップ

投稿2020/03/18 13:02

textFieldが空の時はどうSwitchをかけばいいか教えてください

テキストフィールドが空のときに仮の値を与えたいんですがnilじゃダメなんですか?

swift

1 @objc func CC(){ 2 3 switch textF { 4 case nil: 5 ff = 0 6 counting = 0 7 labelA.text = String(counting) 8 default: 9 ff = Int(textF.text!)! 10 counting = 0 11 labelA.text = String(counting) 12 } 13

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

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

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

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

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

nakasho_dev

2020/03/19 12:33

ベストアンサーがついた後のコメントになってしまいますが、UITextFieldのtextはOptionalなのでnilを考慮した実装をすべきです。現在のUIKitの実装ではnilが入ることはないようですがインタフェースとしてはOptionalですしUIKitの実装がいつ変わるかはApple次第なので、安易に!を使うのではなく MasakiHori さんのようなnilを考慮した実装の方が安全です。nilが入るようになった際にInt(textField.text!)というような処理をしたらアプリが落ちる可能性もあります。
KTH

2020/03/19 12:41

ちなみにですがテキストフィールドでnilが入るときってどういう入力をされたときが考えられますか?
nakasho_dev

2020/03/19 14:20

AppleのUIKitの仕様書でUITextFieldのtextはString?(Optional)であると書かれています。そして、デフォルト値が空文字であることも書かれています。 つまり現時点ではnilになることはないはずです。 ですが、デフォルト値が空文字だからだと!で処理せずにOptional型を意識した実装をすべきです。
guest

回答3

0

switchの使い方はほかの人に譲って同じ処理を別の書き方で書く方法を紹介します

swift

1ff = textF.text.flatMap(Int.init) ?? 0 2counting = 0 3labelA.text = String(counting) 4//これ↑はこう↓でいいのでは? 5labelA.text = "0"

Optional#flatMapというメソッドがあます
このメソッドは値がnilでない時は引数に渡した関数にアンラップした値を渡して実行しその戻り値がnilでない時はアンラップした値をnilの時はnilを返し、値がnilの時はnilを返します

クロージャを使って書くと

swift

1ff = textF.text.flatMap { (text: String) -> Int? in 2 return Int(text) 3} ?? 0

となります

投稿2020/03/19 01:17

MasakiHori

総合スコア3384

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

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

0

ベストアンサー

UITextFieldtextフィールドは、入力文字が無い場合には nil ではなく ""(空文字)が入ります。

なので、質問者さんのコードに freemann さんのご指摘を加えると、

swift

1switch textF.text { //ここが違うのではないかな 2 case "": //ここも変更 3 ff = 0 4 counting = 0 5 labelA.text = String(counting) 6 default: 7 ff = Int(textF.text!)! 8 counting = 0 9 labelA.text = String(counting) 10}

とすれば、動くようになると思います。


ちょっと先回りですが、switch-caseを使うよりも、if文の方が一般的なので、そちらの例も書いておきます。

swift

1 if textField.text!.isEmpty { 2 // テキストフィールドが空(もしくは nil)の場合 3 ff = 0 4 counting = 0 5 } else { 6 // テキストフィールドに文字が入力されていた場合 7 // 数値でない場合は0にする 8 ff = Int(textField.text!) ?? 0 9 counting = 0 10 } 11 label.text = String(counting)

あと、テキストフィールドに入る文字は必ずしも数値とは限らないと思います。

キーボードをnumberPadにしておけば数値以外の文字が入る危険性は減りますが、それでも万が一数値以外の文字が入ったときの場合に備えた処理は必要だとおもいます。

なので、数値以外の値が入力された場合の対策も追加してみました。

投稿2020/03/18 14:30

TsukubaDepot

総合スコア5086

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

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

0

Swift

1switch textF.text { //ここが違うのではないかな 2 case nil: 3 ff = 0 4 counting = 0 5 labelA.text = String(counting) 6 default: 7 ff = Int(textF.text!)! 8 counting = 0 9 labelA.text = String(counting) 10 }

投稿2020/03/18 13:39

freemann

総合スコア264

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問