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

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

ただいまの
回答率

88.78%

Swift 計算機 落ちてしまう

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 418

kohei2000

score 16

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var labelA: UITextField!
@IBOutlet weak var labelB: UITextField!
@IBOutlet weak var result: UITextField!

@IBAction func plus(_ sender: Any) {
var fieldA: Int? = Int(labelA.text!)
var fieldB: Int? = Int(labelB.text!)
if (fieldA != nil && fieldB != nil){
result.text = String(fieldA! + fieldB!)
}else{
result.text = "you made a mistake"
}
}

@IBAction func minus(_ sender: Any) {
var fieldA: Int? = Int(labelA.text!)
var fieldB: Int? = Int(labelB.text!)
if (fieldA != nil && fieldB != nil){
result.text = String(fieldA! - fieldB!)
}else{
result.text = "you made a mistake"
}
}

@IBAction func times(_ sender: Any) {
var fieldA: Int? = Int(labelA.text!)
var fieldB: Int? = Int(labelB.text!)
if (fieldA != nil && fieldB != nil){
result.text = String(fieldA! * fieldB!)
}else{
result.text = "you made a mistake"
}
}
@IBAction func dividedby(_ sender: Any) {
var fieldA: Int? = Int(labelA.text!)
var fieldB: Int? = Int(labelB.text!)
if (fieldA != nil && fieldB != nil){
result.text = String(fieldA! % fieldB!)
}else{
result.text = "you made a mistake"
}
}
}
+、−、×のところはエラーがでず計算が出来るのですが、
割り算のところだけエラーがでて落ちてしまい計算が出来ません。
(signal SIGABRTと表示される)
原因が全く分かりませんので、分かる人がいましたら教えてください、
宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • nakasho_dev

    2019/05/23 20:46

    質問するときのヒント(https://teratail.com/help/question-tips)を良く読んで、わかりやすく伝えないと回答は得られませんよ。少なくとも該当ソースは提示しましょう。

    キャンセル

  • nakasho_dev

    2019/05/23 22:02

    ソースは写真ではなくテキストで表示してください。その際にヒントにあるようにタグで囲んで整形した状態で表示するようにするとソースが読みやすいです。また、どのようなインプットで、どのようなエラーメッセージが出るかも記述しましょう。割り算のみ落ちるというのは、なんとなくゼロ除算な気がします。

    キャンセル

  • nakasho_dev

    2019/05/24 01:36

    繰り返し言いますが、どのようなインプットでエラーが出るのでしょうか。labelAとlabelBに入れた値を記述し、+、-、* ではどのようなresultになるのか示してください。また、割り算でエラーとなった際にXCodeの下側のWindowに何かエラーメッセージがあればそれも提示ください。また、%は剰余です。除算は/です。

    キャンセル

回答 3

+1

ソースコードをコピー&ペーストして、部品を適当に配置して動かしてみました。

labelB(というテキストフィールド)が0のときに、
Fatal error: Division by zero in remainder operation
2019-05-24 17:58:47.135182+0900 Test[10445:623576] Fatal error: Division by zero in remainder operation
と0で除算したためにエラーが出る程度で、signal SIGABRTにはなりませんでしたよ。

プロジェクトの部品が壊れている可能性もあるかもしれません。

  • XCodeを再起動してみる
  • メニューの[Product]→[Clean Build Folder]でビルドフォルダーを一度きれいにする
  • dividedby()に関連付けられているボタンをMain.storyboardから削除し、新しいボタンを作り直す
    などを試してみてください。

なお、新しいボタンに既存のコードを関連付けるには、Assistant Editorでコードの行頭にある丸印から、ストーリーボードの部品に向かってドラッグしてくださいね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/24 18:24

    MasaWorks様
    アドバイス有難う御座います。
    一度クリーンしましたら、できました。

    キャンセル

checkベストアンサー

0

書き方合っているかわかりませんが、割り算は0で割るとランタイムエラーになるので、回避する必要があります。
(あとたぶんfieldA! % fieldB!ではなくfieldA! / fieldB!かと。)

以下適当に修正したコードです。

@IBAction func dividedby(_ sender: Any) {
    let fieldA: Int? = Int(labelA.text!)
    let fieldB: Int? = Int(labelB.text!)
    if fieldA != nil && fieldB != nil && fieldB! != 0 {
        result.text = String(fieldA! / fieldB!)
    } else {
        result.text = "you made a mistake"
    }
}

※アンラップの方法はもうちょっとなんとかした方が良いですが本題ではないので放置します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/24 18:14

    takabosoft様、大変感謝致します。
    有難うございます。

    キャンセル

-1

回答者はあなたのコードを自分のエディターで見やすく整形したいって思ってないので、codeタグで囲ってもらえると見やすいです。

エラーですが、それだけ見せられても何も分からないです。
せめてエラートレースとかないですかね。

エラーで落ちる関数のとこにブレークポイント置いて確認すると理由がわかるかもしれないです

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/24 18:13 編集

    koskacts様
    有難うございます。

    キャンセル

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

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

関連した質問

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