66612


表題の通りですが、2次元配列を **Index Out Of Rang**
eを避けた初期化の方法としてXcodeが候補を表示してくれる以下のコードがコンパイルエラーになります。

[code]

    var dayCells: [[AnyObject]] = [[AnyObject]](repeating: [AnyObject], count: 7)
    
[/code]

AnnyObjectにした理由はボタンやビューなどのオブジェクトが入るからです。AnyObjectのところをIntやStringにしてもダメです。  
随分頑張ったのですが、`Cannot convert value of type '[AnyObject].Type' to expected
argument type '[AnyObject]'`というエラーです。  
エラーのマークが付くのはコードの3番めの`[AnyObject]`です。

どうか皆さんのお知恵をお貸しください。


CC BY-SA 4.0
2020-05-14T19:36:33.180
66611
2020-05-14T22:08:21.857
2020-05-14T22:08:21.857
19110
516
question
swift array
Swiftで2次元配列の初期化がコンパイルエラーで通りません。


`Array.init(repeating:count:)`で配列を初期化する場合、`repeating:`に指定しないといけないのは、個々の要素の値であり、個々の要素の型ではありません。

簡単のために、まずは一次元配列で見ていくと、次の2つの違いはお分かりでしょうか?

[code]

    var arr1: [Int] = Array(repeating: Int, count: 7)
    //->Cannot convert value of type 'Int.Type' to expected argument type 'Int'
    var arr2: [Int] = Array(repeating: 0, count: 7)
    //-> コンパイルが通る
    
[/code]

あなたの現在のコードは、この2つの上の方と同じことをやっているのです。`[AnyObject]`は、外側の配列から見れば要素の型であり、それを`repeating:`引数に与えようとしてしまっています。

[code]

    var dayCells: [[AnyObject]] = [[AnyObject]](repeating: [AnyObject], count: 7)
                   -----------                             -----------
                   ↑[AnyObject]は、要素の型。                 ↑ここには「型」ではなく、その型の「値」が必要
    
[/code]

`repeating:`引数に与えるのは、要素の型である`[AnyObject]`型の「値」でないといけません。

例えば、内側の配列の要素数が0でも良いならばこう書けます。

[code]

    var dayCells: [[AnyObject]] = [[AnyObject]](repeating: [], count: 7)
    
[/code]

「Index Out Of Rangeを避け」るために、内側の配列の要素数も指定しないといけないなら、(例えば外側と同じ7を使うなら)こんな風に書けます。

[code]

    var dayCells: [[AnyObject]] = [[AnyObject]](repeating: [AnyObject](repeating: NSObject(), count: 7), count: 7)
    
[/code]

(`AnyObject`型のダミー要素として、`NSObject`のインスタンスを用いていますが、他に適当なものがあれば置き換えてください。)


CC BY-SA 4.0
2020-05-14T20:06:12.790
66612
2020-05-14T20:06:12.790
13972
66611
answer