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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

1回答

6011閲覧

偶数か奇数かを判断する簡単なものですが

ryuuichi2014

総合スコア115

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/04/22 09:10

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var inputText: UITextField! 6 7 @IBOutlet weak var anser: UILabel! 8 9 @IBAction func inButton(sender: AnyObject) { 10 11 var str = inputText.text 12 13 if str == nil || str == "" { 14 str = "0" 15 } 16 17 let intNum:Double! = Double(str!) 18 19 let an:Double! = intNum! % 2 20 21 var msg:String = "" 22 if an == 0 { 23 msg = "偶数" 24 } else { 25 msg = "奇数" 26 } 27 28 anser.text = msg 29 30 } 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 } 39 40}

let intNum:Double! = Double(str!)

などの ! をつけるタイミング? のようなものがいまいちわかりません。

参考になるサイトなどがありましたら教えてください。

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

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

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

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

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

guest

回答1

0

まず以下のサイトを一読することをオススメします。

どこよりも分かりやすいSwiftの"?"と"!"

ryuuichi2014さんのコードを自分なりに書きなおしてみました。

コードを見るとわかると思いますが、「!」のマークが一切ありません。
「!」を変数の後ろに付けると、強制的にnilでは無いと明示していることになります(Forced Unwrapping)、この場合値がnilだった時にアプリが落ちます。

コードの中でnilのチェックはしているので問題ないのですが、Optional Bindingというしくみを使うとnilで無い場合のみ値を取り出しif文の中を実行する機能があります。(if let ~)

Optional Bindingで取り出した値はnilではないのでその後「!」の出番はありません。

提示されているコードで問題があるとすると以下の部分だと思います。

strはnilではなく、空文字だった場合は”0”が入って言いますが"a"などの文字が入った場合intNumがnilになってしまうので、その後の計算で落ちます。

極力「!」を使わない様に記述することで更に安全なコードが書けるかと思います。

swift

1let intNum:Double! = Double(str!) 2 3let an:Double! = intNum! % 2

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var inputText: UITextField! 6 @IBOutlet weak var anser: UILabel! 7 8 @IBAction func inButton(sender: AnyObject) { 9 10 // inputText.textがnilの場合以下の処理は行わないように早期にreturnします 11 guard let str = inputText.text else { return } 12 13 // 以下strにnilが入っていないことは保証されています。 14 15 // ちょっと強引ですがstrが空文字か比較して空文字の場合"0"を代入しています 16 if let intNum = Double(str == "" ? "0" : str) { 17 18 // この中のintNumもnilで無いことが保証されています。 19 // nilでは無いのでそのまま計算します。 20 let an:Double = intNum % 2 21 22 // 三項演算子でan == 0がtrueかfalseにより代入する値を分けます。 23 anser.text = an == 0 ? "偶数" : "奇数" 24 } 25 } 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 } 30}

投稿2016/04/22 13:12

編集2016/04/22 13:14
_Kentarou

総合スコア8490

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問