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

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

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

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

Swift

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

Q&A

解決済

2回答

3359閲覧

【初心者】Swiftにて 計算機(電卓)作成中。シュミレート中にエラーが発生します。。。(質問編集しました)

AndrewRichrdson

総合スコア13

Xcode

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

Swift

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

0グッド

0クリップ

投稿2015/07/28 12:55

編集2015/08/01 11:37
import UIKit class ViewController: UIViewController { @IBOutlet weak var display: UILabel! var userIsInTheMiddleOfTypingNumber : Bool = false @IBAction func appendDigit(sender: UIButton) { let digit = sender.currentTitle! if userIsInTheMiddleOfTypingNumber { display.text = display.text! + digit } else { display.text = digit userIsInTheMiddleOfTypingNumber = true } } @IBAction func operate(sender: UIButton) { let operation = sender.currentTitle! if userIsInTheMiddleOfTypingNumber { enter() } switch operation { case "✕":performOperation { $0 * $1 } case "÷":performOperation { $1 / $0 } case "+":performOperation { $0 + $1 } case "−":performOperation { $1 - $0 } case "√":performOperation2 { sqrt($0) } default: break } } func performOperation(operation: (Double,Double) ->Double) { if operandStack.count >= 2 { displayValue = operation(operandStack.removeLast() , operandStack.removeLast()) enter() } } func performOperation2(operation: Double ->Double) { if operandStack.count >= 1 { displayValue = operation(operandStack.removeLast()) enter() } } var operandStack = Array<Double>() @IBAction func enter() { userIsInTheMiddleOfTypingNumber = false operandStack.append(displayValue) println("operandStack = \(operandStack)") } var displayValue: Double { get { return NSNumberFormatter().numberFromString(display.text!)!.doubleValue } set { display.text = "\(newValue)" userIsInTheMiddleOfTypingNumber = false } } } コード
get { return NSNumberFormatter().numberFromString(display.text!)!.doubleValue }

の部分にエラーがでます。どうしてでしょうか。。。。

追加:画像をのせました!おねがいします。
エラーというのは、シュミレーター起動→数字タップ(ラベルにその数字表示)→エンター→次の数字(ラベルに表示)→✕をタップ→クラッシュ(そしてこの画面が出ます)

イメージ説明

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

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

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

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

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

edo_m18

2015/07/28 13:51

どんなエラーが出ていますか? できるだけ詳細に書くと適切な返答が得られると思いますよ。
guest

回答2

0

ベストアンサー

お、これはスタンフォード大学のiPhoneアプリ開発の講義ですね^^/

この位置でこのエラーが出るのはdisplayラベルのテキストを数字に変換するときに失敗している可能性が高いと思います。Storyboardの数字のラベルに数字以外の文字(例えばスペースとか)が入ってたりしませんか?

Storyboardを確認してみるのと、下記のようにdisplay.text!の値をログに出して中身を確認してみると何かわかるかもしれません。

Swift

1 @IBAction func appendDigit(sender: UIButton) { 2 let digit = sender.currentTitle! 3 if userIsInTheMiddleOfTypingANumber { 4 display.text = display.text! + digit 5 } 6 else { 7 display.text = digit 8 userIsInTheMiddleOfTypingANumber = true 9 } 10 println(display.text!) // <-これ追加 11 }

投稿2015/08/01 05:43

jollyjoester

総合スコア1585

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

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

AndrewRichrdson

2015/08/01 11:43

回答ありがとうございました・_・ そうです!英語が難しいですが、がんばって講義をうけております。 投稿の画像を変更いたしましたので確認していただきたいのですが、ログ値の数字はおかしくなさそうです(スペースが入ってるなど)。 中身を確認する方法をおしえていただきありがとうございました! また、✕ + ー ÷ のをタップしたらクラッシュになるので、 @IBAction func operate(sender: UIButton) { let operation = sender.currentTitle! if userIsInTheMiddleOfTypingNumber { enter() } switch operation { case "✕":performOperation { $0 * $1 } case "÷":performOperation { $1 / $0 } case "+":performOperation { $0 + $1 } case "−":performOperation { $1 - $0 } case "√":performOperation2 { sqrt($0) } default: break } の部分はおかしくないかみていただけませんか? よろしくおねがいします
jollyjoester

2015/08/03 02:41

> ✕ + ー ÷ のをタップしたらクラッシュになるので ここがクラッシュするということはswitchの中のperformOperationが呼ばれていて、その中のenter()でdisplayValueをoperandStackにappendするところで落ちていると思われます。printlnで色々なところの値を出しまくってdisplayValueの値を確認するか、Storyboardのラベルを全部消してもう一度つなぎ直す等やってみるとうまくいったりするかもしれません:-)
AndrewRichrdson

2015/08/06 01:00

つなぎ直すとできました!!(appendなんとかを外してみると、しっかりと計算できるようになりました)ありがとうございました
guest

0

なるほど。
もしかしてdisplay.text!のところがnilになっていませんか?

unexpectedly found nil while unwrapping an optional value

nilを期待していないところで使っている旨のエラーなので。
一度、!を指定しているところを変数に入れてみてどんな値になっているか確認すると分かりやすいと思います。

こちらの記事の似たエラーの解説が参考になるかもしれません。
http://qiita.com/susieyy/items/1eddfe26b248c741b902

投稿2015/07/29 14:41

edo_m18

総合スコア2283

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

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

AndrewRichrdson

2015/07/29 23:52

回答ありがとうございます。altおしながらクリックでそれぞれ性質をみたところ、 display は @IBOutlet weak var display: UILabel! text! は var text: String? { get set }  でありました。?でオプショナルを明記するのでしょうか? また、"変数に入れてみて"の具体的な方法がわかりませんでした(verでおきかえてもうまくいきませんですし、、、) わかりにくい文面、質問ですがよろしくおねがいします。
edo_m18

2015/07/30 00:30

以下のような意味でした。 ``` if let text = display.text { return NSNumberFormatter().numberFromString(text)!.doubleValue } return 0 ``` `numberFromString`の引数が`String?`型を受け入れていないためのエラーかなと思ったので、上記のようにすると問題がでなくなるかと思います。 そしてもし上記でエラーが出なくなれば`display.text`が`nil`になっているためのエラーの原因と思われます。
AndrewRichrdson

2015/07/30 16:06

やはり原因がわかりませんでした。getに上記の定数を入れたら、setが起用しなくなり、ところどころdisplayValueがおかしくなりました。 そろそろわけがわからなくなってきておりますので、引き上げることもかんがえております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問