“Swift 型 Array”あたりでググっても、日本語での解決策記事が見当たらないので、発表時点からSwiftを触っている上級者ならいざ知らず、私のようなiOS開発初心者がいきなりSwiftから触るケースに関しては、上記のようなタイトルで記事があったほうが良いかな?と思い共有します。
解決策
var arrayWithAnyType :[Any] = [/* You can insert here any initial values */]
です。
核心は:[Any]
にあります。下記はこちらからの引用です。
単にSwiftのArrayを拡張しただけなので、型の混在する配列は作れません
とありますが、これはswiftの仕様により「黙示的Any」が認められないためです。
明示的にAnyと書けば通ると思います。
var a :Array = ["String", "String2", "String3" ]
var b :Array = [4, 7, 8 ]
var c: [Any] = [a, b, 0]
c.shift() // -> ["String", "String2", "String3"]
>ちなみに import Cocoa を書いてしまうと (黙示的なAnyが認められないのは同じですが) 自動的にNSArrayとして処理されてしまい、エクステンションが存在しないということでエラーとなるようです。
## では検証していきましょう。
class Foo {}
let aClass :Foo = Foo()
let anArray :Array = [0, 1, 2]
let anInt :Int = 0
// 普通にArray型であると明示的に示すと
var array :Array = ["String" ]
array.append(aClass) // Error "'Foo' is not convertible to 'String'"
array.append(anArray) // Error "'[Int]' is not convertible to 'String'"
array.append(anInt) // Error "'Int' is not convertible to 'String'"
// 上記全て怒られます
array.append("Another") // ->["String","Another"] //唯一怒られません
これは```var array :Array<String> = ["String” ]```と明示的に書いたものの省略形とみなされるからです。初期値に文字列型を代入しているため、その時点でこれは文字列を扱うための配列だとみなされるのです。
## ```:[Any]```で宣言してみましょう。
var arrayWithAnyType :[Any] = ["String"]
arrayWithAnyType.append(aClass) // -> ["String", Foo]
arrayWithAnyType.append(anArray) // -> ["String", Foo, [0, 1, 2]]
arrayWithAnyType.append(anInt) // -> ["String", Foo]
arrayWithAnyType.count // -> 4 // 3要素追加できてます
省略しない記述は```var arrayWithAnyType :Array<Any> = ["String”]```です。
## こんなの何に使うんだ?
と思われる方は多いと思いますが、私はここ一週間一生懸命[こういうの](http://qiita.com/worthmine/items/40bfdd8f1f75bfe3463a)を書いていました。