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

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

ただいまの
回答率

90.35%

  • Swift

    7658questions

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

swift 無限ループしてしまう

解決済

回答 2

投稿 編集

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

Ceratophrys

score 45

class FizzBuzz{

     let value = Decide()

    var arrayResult: [String]{
        get{
            return self.arrayResult
        }
        set(newValue){
            self.arrayResult = newValue
        }
    }



    func processed(number:Int) -> [String]{
        for number in 1..<number{
            arrayResult[number] = value.decide(by: number)
        }
        return arrayResult
    }


}
class Decide {
    let value = IsFizzBuzz()
    func decide(by number:Int) -> String{
        if (value.isFizz(a: number) && value.isBuzz(a: number)){return "FizzBuzz"}
        if (value.isFizz(a: number))                           {return "Fizz"}
        if (value.isBuzz(a: number))                           {return "Buzz"}
        return ""
    }
}

class IsFizzBuzz{
    func isFizz(a number:Int) -> Bool{
        if(number%3 == 0 ){
            return true
        }
        return false
    }

    func isBuzz(a number:Int) -> Bool{
        if(number%5 == 0){
            return true
        }
        return false
    }
}

processedを呼ぶとarrayResult[number] = value.decide(by: number)で無限にゲッターを読んでしまうようです。
どのようにしたらいいですか?

具体できにしたいこと
arryResultをjavaで言うフィールドのように使用したい
value.decide(by: number)の結果を配列それぞれの配列に保持
ループが終わり次第配列全てをリターン

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

arrayResultに定義しているgetter/setterは自分自身の実装を参照しているため無限に再帰呼び出ししてしまうのでしょうね。swiftコンパイラーが文句を言ってくれると思いきや何もいわずにコンパイルが成功してしまいますね・・・なんとなくコンパイラーの「さぼり」に見えます。

対処:

getter/setter内で自分自身を参照しないようにすれば動くようにはなると思います。そのためにはarrayResultとは別のインスタンス変数を用意しておきそちらを参照するように変更する必要がありますが・・・arrayResultになぜgetter/setterを定義したいのでしょう?ご質問のコードを拝見する限り意味がない気がします。

そもそもインスタンス変数にする必要もない気がします。例えばいつ長さが決まるかと言えばprocessedメソッドが呼ばたときですね。単にprocessedメソッドのローカル変数として宣言すれば済むと思います。

func processed(number:Int) -> [String]{
    var arrayResult = Array(repeating: "", count: number)
    for number in 1..<number {
        arrayResult[number] = value.decide(by: number)
    }
    return arrayResult
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/07 14:21

    ご指摘ありがとうございます

    今swiftを勉強中でどのような記述の仕方ができるのかや、動作はどうなっているのかを学ぶ為にgetter/setterを使用していました。

    無駄なことを記述してしまっていることに関しては、技術不足な点もしくは、試し書きをしている最中だと思ってください。まだコードをうまく記述できなく学ぶことが多いいと自覚しています。

    わかりやすい解説でしたありがとうございます。

    キャンセル

  • 2018/05/07 14:24

    なるほど、納得しました。
    いろいろ試しながらというのは理解しやすくなるのでよい方法と思います!

    キャンセル

+1

arrayResult関係の処理が何をしているのかよく分からないのですが、

var arrayResult: [String]{
    get{
        return self.arrayResult
    }
    set(newValue){
        self.arrayResult = newValue
    }
}

var arrayResult = [String]()

にして、

func processed(number:Int) -> [String]{
    for number in 1..<number{
        arrayResult[number] = value.decide(by: number)
    }
    return arrayResult
}

を、

func processed(number:Int) -> [String]{
    arrayResult = []
    for number in 1..<number{
        arrayResult += [value.decide(by: number)]
    }
    return arrayResult
}

にするのではダメでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Swift

    7658questions

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