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

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

ただいまの
回答率

88.04%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,627
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
        }

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

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



イメージ説明
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • edo_m18

    2015/07/28 22:51

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

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

    @IBAction func appendDigit(sender: UIButton) {
        let digit = sender.currentTitle!
        if userIsInTheMiddleOfTypingANumber {
            display.text = display.text! + digit
        }
        else {
            display.text = digit
            userIsInTheMiddleOfTypingANumber = true
        }
        println(display.text!)  // <-これ追加
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/01 20: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
    }

    の部分はおかしくないかみていただけませんか?
    よろしくおねがいします

    キャンセル

  • 2015/08/03 11:41

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

    キャンセル

  • 2015/08/06 10:00

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

    キャンセル

  • 2015/08/06 12:13

    よかったです^^/

    キャンセル

0

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

unexpectedly found nil while unwrapping an optional value

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 08:52

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

    わかりにくい文面、質問ですがよろしくおねがいします。

    キャンセル

  • 2015/07/30 09:30

    以下のような意味でした。

    ```
    if let text = display.text {
    return NSNumberFormatter().numberFromString(text)!.doubleValue
    }
    return 0
    ```

    `numberFromString`の引数が`String?`型を受け入れていないためのエラーかなと思ったので、上記のようにすると問題がでなくなるかと思います。
    そしてもし上記でエラーが出なくなれば`display.text`が`nil`になっているためのエラーの原因と思われます。

    キャンセル

  • 2015/07/31 01:06

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

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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