

以下のコードが正しいかも含めての質問になります。  
XCode9.0でSwift4のコードになります。

下記コードで実行しようとしたところ  
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2,
address=0x7fff5c02cff8).という例外が発生しました。  
1.理由をご教示いただきたいです  
2.そもそも下のコードは誤りでしょうか？  
クラス内に自身のインスタンスを持ったり、自身のインスタンスの宣言  
自身のインスタンスを格納する配列定義等は可能でしょうか？

[code]

    class Test{
        var test:Double{
            get{
                return self.test+100
            }
            set(a){
                self.test=a
            }
        }
    
        var testList:Array<Test> = Array()
    
        init(a:Double){
            self.test = a
            addTest(a:a)
        }
    
        func addTest(a:Double){
            let t:Test = Test(a:a)
            testList.append(t)
        }
    }
    
    var test1:Test = Test(a:1)　　※←例外表示場所
    print(test1.testList[0].test)
    
[/code]


CC BY-SA 3.0
2017-10-16T07:19:39.003
38753
2021-04-01T23:24:30.377
25745
question
swift
Swiftのclass内で自身の型を持ったリストにアクセスしようとすると例外が発生する理由


1の回答:

  1. `test1` を定義して、`Test`型の初期化子（`init()`）が呼び出されます。ここまでは問題ありません。
  2. `self.test = a` `test`変数に`a`を代入していますね。これも問題ありません。
  3. `addTest()`関数を呼び出します。

`addTest()` 関数 `{`

  4. `let t: Test = Test(a: a)` ここで問題が発生します。まだまだ見ていきましょう。
  5. `t` を定義して、`Test`型の初期化子（`init()`）が呼び出されます。

初期化子 `{`

  6. `self.test = a` `test`変数に`a`を代入
  7. `addTest()`関数を呼び出します。ここでもう一度`addTest()`関数に入ります。

`addTest()` 関数 `{`

  8. 分かりましたでしょうか。初期化または関数の実行を止めない限り永遠にループしてしまいます。この後も永遠に処理は続きます…。ループしすぎて「もう我慢できない！」と、システムが自動的にプログラムを落とした結果、あのエラーが現れます。

`}`

`}`

`}`

2の回答: YES。上の理由で誤りです。  
一定回数繰り返すと止まるように、

[code]

    init(a: Double, count: Int = 0){
        self.test = a
        addTest(a: a, count + 1)
    }
    
    func addTest(a: Double, count: Int){
        if count < 5 {
            let t: Test = Test(a: a, count: count)
            testList.append(t)
        }
    }
    
[/code]

こういったやり方でループした数をカウントすればOKだと思います（もし無限に続かないといけない場合は別ですが）。

メモ: `var testList:Array<Test> = Array()` → `var testList: [Test] = []`


CC BY-SA 4.0
2021-04-01T13:34:39.037
75032
2021-04-01T23:24:30.377
2021-04-01T23:24:30.377
39579
39579
38753
answer