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

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

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

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

Q&A

解決済

2回答

572閲覧

swift 無限ループしてしまう

L85A2

総合スコア60

Swift

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

0グッド

0クリップ

投稿2018/05/07 03:49

編集2018/05/07 03:50

Swift

1class FizzBuzz{ 2 3 let value = Decide() 4 5 var arrayResult: [String]{ 6 get{ 7 return self.arrayResult 8 } 9 set(newValue){ 10 self.arrayResult = newValue 11 } 12 } 13 14 15 16 func processed(number:Int) -> [String]{ 17 for number in 1..<number{ 18 arrayResult[number] = value.decide(by: number) 19 } 20 return arrayResult 21 } 22 23 24} 25class Decide { 26 let value = IsFizzBuzz() 27 func decide(by number:Int) -> String{ 28 if (value.isFizz(a: number) && value.isBuzz(a: number)){return "FizzBuzz"} 29 if (value.isFizz(a: number)) {return "Fizz"} 30 if (value.isBuzz(a: number)) {return "Buzz"} 31 return "" 32 } 33} 34 35class IsFizzBuzz{ 36 func isFizz(a number:Int) -> Bool{ 37 if(number%3 == 0 ){ 38 return true 39 } 40 return false 41 } 42 43 func isBuzz(a number:Int) -> Bool{ 44 if(number%5 == 0){ 45 return true 46 } 47 return false 48 } 49}

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

対処:

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

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

swfit

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

投稿2018/05/07 04:41

編集2018/05/07 04:42
KSwordOfHaste

総合スコア18394

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

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

L85A2

2018/05/07 05:21

ご指摘ありがとうございます 今swiftを勉強中でどのような記述の仕方ができるのかや、動作はどうなっているのかを学ぶ為にgetter/setterを使用していました。 無駄なことを記述してしまっていることに関しては、技術不足な点もしくは、試し書きをしている最中だと思ってください。まだコードをうまく記述できなく学ぶことが多いいと自覚しています。 わかりやすい解説でしたありがとうございます。
KSwordOfHaste

2018/05/07 05:24

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

0

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

swift

1var arrayResult: [String]{ 2 get{ 3 return self.arrayResult 4 } 5 set(newValue){ 6 self.arrayResult = newValue 7 } 8}

swift

1var arrayResult = [String]()

にして、

swift

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

を、

swift

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

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

投稿2018/05/07 04:12

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問