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

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

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

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

Q&A

1回答

580閲覧

0を入れているのだがnilエラーが出る

KTH

総合スコア86

Swift

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

0グッド

0クリップ

投稿2020/08/19 03:51

糖質の計算をしたいのですが、ゼロを入れているのにエラーが出てしまいます

初期値が0はだめなんですか?

入力されるたびに計算されラベルが更新されるようにしたいのですがエラーを消す方法を教えて下さい

swift

1import UIKit 2 3class glamCulcViewController: UIViewController,UITextFieldDelegate { 4 5 var carbonTotal = 0,protainTotal = 0,fatTotal = 0,glamtotal = 0 6 7 8 @IBOutlet weak var carbon: UITextField! 9 @IBOutlet weak var protain: UITextField! 10 @IBOutlet weak var fat: UITextField! 11 @IBOutlet weak var wait: UITextField! 12 @IBOutlet weak var xgWait: UITextField! 13 14 15 @IBOutlet weak var carbonDisplay: UILabel! 16 @IBOutlet weak var protainDisplay: UILabel! 17 @IBOutlet weak var fatDisplay: UILabel! 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 carbon.delegate = self 22 protain.delegate = self 23 fat.delegate = self 24 wait.delegate = self 25 xgWait.delegate = self 26 27 } 28 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 29 30 31 carbonTotal = cul(item: Int(carbon.text!)!, wait: Int(wait.text!)!, xgWait: Int(xgWait.text!)!) 32 print(carbonTotal) 33 protainTotal = cul(item: Int(protain.text!)!, wait: Int(wait.text!)!, xgWait: Int(xgWait.text!)!) 34 print(protainTotal) 35 fatTotal = cul(item: Int(fat.text!)!, wait: Int(wait.text!)!, xgWait: Int(xgWait.text!)!) 36 print(fatTotal) 37 return true 38 } 39 40 func cul(item:Int,wait:Int,xgWait:Int) -> Int { 41 let c = item/wait*xgWait 42 return c 43 } 44} 45

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

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

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

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

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

guest

回答1

0

とりあえずこうしたらどうでしょう。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { carbonTotal = cul(item: carbon.text, wait: wait.text, xgWait: xgWait.text) print(carbonTotal) protainTotal = cul(item: protain.text, wait: wait.text, xgWait: xgWait.text) print(protainTotal) fatTotal = cul(item: fat.text, wait: wait.text, xgWait: xgWait.text) print(fatTotal) return true } func cul(item: String, wait: String, xgWait: String) -> Int { let i = Int(item) ?? 0 let w = Int(wait) ?? 1 let x = Int(xgWait) ?? 1 let c = i / w * x return c }

初期化するべきなのは、テキストフィールドのtextプロパティの値です。
最初は""だと思います。
例えばInt(carbon.text!)!のところは、carbonテキストフィールドの文字列が""になったら、Int("")!となり、Int("")nilです。nil!をつけたらエラーになります。!は、nilだったらエラーにしろという意味なので。

テキストフィールドなので、編集中に""になったりするのは避けられません。
したがって、""であっても良いように計算する必要があります。

投稿2020/08/19 07:51

eytyet

総合スコア803

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

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

KTH

2020/08/20 00:17

cafbonに12.7waitに70xgwaitに70を入れると答えが120になってしまいます 答えを12.7にするにはどうすればいいのかも教えていただけませんか?
eytyet

2020/08/20 06:06 編集

Intで整数に変換しているので、12.7/70*70ではなくて、12/70*70になっていて、0が答えになると思います。各変数が整数型なので、計算結果も整数型です。最初の12/70が0になり、0*70で0になります。 と思いましたが、実際にやってみたら、Int("12.7")がnilになってしまうので、iが0になり、答えも0になりました・・・ IntをDobuleに変えたら実数で計算できます。
KTH

2020/08/20 07:35

ほんとに丁寧にありがとうございました(^o^) ちなみになんですがエンターを押さずにリアルタイムで正確な数値を出すにはどうすればいいのかまで教えていただけませんか? func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { return true } をつかってもエンターをおさないと正確な数値にならなくて困っています
eytyet

2020/08/20 07:54

キーボードが日本語入力モードだから、ではありませんか。
KTH

2020/08/21 04:47

キーボードのタイプをdecimalpadにしているのですがそれとは違うのですか?
eytyet

2020/08/21 05:33

それなら問題ないですね。失礼しました。 原因はキーボードではなくて、使っているデリゲートメソッドが、func textField(_:shouldChangeCharactersIn:replacementString:)だからだと思います。このメソッドは、この文字列を追加してもいいか?と問い合わせるためにあり、呼ばれた時点ではtextField.textはまだ文字を追加する前です。例えばまだ何も入力していない状態から1を押したら、textField.textは""で、stringに"1"が入って来ます。その状態でtextField.textを評価しているので、エンターしないと反映されないようにみえます。 以下のようにして、入力後の文字列を作ることはできます。 guard let text = textField.text as NSString? else { return true } let newText = text.replacingCharacters(in: range, with: string) ただし、今の実装例だと、どのtextFieldに文字を入力してもこのメソッドが呼ばれていると思います。更新されるのがどのテキストフィールドなのかを判別して、作成した入力後の文字列を使うようにする必要がありますね。 各テキストフィールドに異なるtagを設定して、判別に使うのが簡単でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問