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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2558閲覧

swiftで電卓

tamago0224

総合スコア71

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

1クリップ

投稿2015/03/19 12:07

以下のような電卓を作成したのですが、Thread 1:signal SIGABRT とエラーが出てしまいます。

自分でエラー箇所を探してみたのですが、見つかりません。わかる方がいらっしゃるのならご協力お願いします。```lang-swift
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var display: UILabel! var userIsInTheMiddleOfTypingANumber: Bool = false @IBAction func appendFigit(sender: UIButton) { let digit = sender.currentTitle! if self.userIsInTheMiddleOfTypingANumber { self.display.text = display.text! + digit } else { self.display.text = digit self.userIsInTheMiddleOfTypingANumber = true } } var operandStack: Array<Double> = Array<Double>() var displayValue: Double { get { return NSNumberFormatter().numberFromString(self.display.text!)!.doubleValue } set{ display.text = "\(newValue)" self.userIsInTheMiddleOfTypingANumber = true } } @IBAction func operate(sender: UIButton) { let operation = sender.currentTitle! if self.userIsInTheMiddleOfTypingANumber { enter() } switch operation { case "×":perFormOperation({$0 * $1}) case "÷":perFormOperation({$1 / $0}) case "−":perFormOperation({$0 - $1}) case "+":perFormOperation({$1 + $0}) default : break } } func perFormOperation(operation: (Double,Double) -> Double) { if operandStack.count >= 2 { displayValue = operation(operandStack.removeLast(),operandStack.removeLast()) enter() } } @IBAction func enter() { self.userIsInTheMiddleOfTypingANumber = false self.operandStack.append(displayValue) }

}

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

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

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

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

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

jollyjoester

2015/03/19 18:45

SIGABRTはどのようなタイミングで発生しますか?アプリ起動時ですか?ボタンを押したときですか?
tamago0224

2015/03/19 23:25

起動した時です。
guest

回答1

0

ベストアンサー

IBOutletやIBActionの接続部分に問題があるパターンだと思います。
Storyboardとソースコードを接続した後で、ソースコード側の変数名などに変更を加えたり、削除してもう一度接続し直したりする場合にハマりがちです。

Storyboardのlabelやbuttonを選択した状態でConnections inspectorをチェックしてみてください。
不要だったり間違った接続が残っている場合、xで削除すると治るかと思います。
(全部削除して繋ぎ直してもOK)

![イメージ説明]WIDTH:250

投稿2015/03/20 03:30

jollyjoester

総合スコア1585

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

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

tamago0224

2015/03/20 11:21

いくつかそのようなミスがあって直してみたところ、アプリが起動して数値を入力するまで至りました。ですが、エンターキー(=)を押すとまた上と同じエラー文を出してしまいます。数値を入力せずにエンターキーを押した場合も同様です。 ちなみに、エンターキーはSent Events欄にあるTouch Up Insideのみにつながっていました。
jollyjoester

2015/03/20 11:25

エンターキーのメソッドの引数がなのが気になります。 @IBAction func enter(sender: UIButton) { としてみるとどうでしょう?
jollyjoester

2015/03/20 11:26

引数を追加した後にまた繋げ直すのも忘れずに
tamago0224

2015/03/20 12:37

その場合、operate関数内のenter()の引数はどのようにするのでしょう?
jollyjoester

2015/03/20 13:13

別関数作ってこんな風にやってみるとか。 @IBAction func enter(sender: UIButton) { enter() } func enter() { self.userIsInTheMiddleOfTypingANumber = false self.operandStack.append(displayValue) }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問