配列の宣言をする際に、条件によって次元の違う配列を戻り値としたいケースがあります。
しかし、関数の実装時に戻り値の配列の次元を決められてしまっているため、以下のような
テストケースの場合、コンパイルエラーとなり、思うように動作してくれません。
このようなケースで上手く動くようなプログラムは書けるのでしょうか?
戻り値の型推論ができると聞き、クロージャの説明を読んでみましたが、今ひとつピンと
きません。もし何かしらの方法があるのであればご教授していただけないでしょうか。
Swift
1func test(gotit: Bool) -> [Int] { return gotit ? [[1,2,3],[4,5,6]] : [1,2,3,4,5,6] }
追記(ご指摘に対する対応)
詳細を説明せず、大変失礼いたしました。 実は、C++の得意な友人より、多次元配列の宣言が面倒な言語は 使う気になれないとバカにされ、何とか関数実装できないかと考え、 以下のような関数を作成したのですが、同じ関数で違う次元の 配列を返すことができればと思い相談させていただきました。
Swift
1func Array1<T>(index: [Int], rV: T) -> [T] { return [T](count: index[index.count-1], repeatedValue: rV) } 2func Array2<T>(index: [Int], rV: T) -> [[T]] { return [[T]](count: index[index.count-2], repeatedValue: Array1(index, rV: rV)) } 3func Array3<T>(index: [Int], rV: T) -> [[[T]]] { return [[[T]]](count: index[index.count-3], repeatedValue: Array2(index, rV: rV)) } 4 5var sw: [[[Bool]]] = Array3([2,3,2], rV: true) 6print(sw) 7// [[[true, true], [true, true], [true, true]], [[true, true], [true, true], [true, true]]] 8 9var dbl: [[[Double]]] = Array3([2,2,3], rV: Double(0.0)) 10print(dbl) 11// [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]]
その関数の呼び出し元では、その戻り値をどのように扱うんですか?
詳細を説明せず、大変失礼いたしました。
実は、C++の得意な友人より、多次元配列の宣言が面倒な言語は
使う気になれないとバカにされ、何とか関数実装できないかと考え、
以下のような関数を作成したのですが、同じ関数で違う次元の
配列を返すことができればと思い相談させていただきました。
func Array1<T>(index: [Int], rV: T) -> [T] { return [T](count: index[index.count-1], repeatedValue: rV) }
func Array2<T>(index: [Int], rV: T) -> [[T]] { return [[T]](count: index[index.count-2], repeatedValue: Array1(index, rV: rV)) }
func Array3<T>(index: [Int], rV: T) -> [[[T]]] { return [[[T]]](count: index[index.count-3], repeatedValue: Array2(index, rV: rV)) }
var sw: [[[Bool]]] = Array3([2,3,2], rV: true)
print(sw) // [[[true, true], [true, true], [true, true]], [[true, true], [true, true], [true, true]]]
var dbl: [[[Double]]] = Array3([2,2,3], rV: Double(0.0))
print(dbl) // [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]]
ん??
test()関数はどこへ行ったのですか?
そのArray1()、Array2()、Array3()は、今回の質問とどのような関係があるんですか?
わかりにくくてすみません。test()関数そのものにそれほど意味はなく、一つの関数で、条件により、一次元配列、二次元配列など、異なる次元の配列を戻り値として返せるのかどうかを質問するためにシンプルに必要部分を抜き出したものとご理解ください。
また、Array1()、Array2()、Array3()に関しては、多次元配列の宣言の際に記述をシンプルにするための関数となっています。Array2()は二次元配列の、Array3()は三次元配列の宣言及び初期化を行います。引数 index: [Int] は各次元の要素数を、rVは初期値となっています。
現状の仕様では、二次元配列を使用する場合はArray2()を、三次元配列を使用する場合はArray3()を呼び出すため、もっとスマートにならないかと考えています。言葉足らずであればすみません。
回答1件
あなたの回答
tips
プレビュー