LoginSignup
11
13

More than 5 years have passed since last update.

[Swift]型の違う値を同じ配列に入れる

Last updated at Posted at 2015-01-19

“Swift 型 Array”あたりでググっても、日本語での解決策記事が見当たらないので、発表時点からSwiftを触っている上級者ならいざ知らず、私のようなiOS開発初心者がいきなりSwiftから触るケースに関しては、上記のようなタイトルで記事があったほうが良いかな?と思い共有します。
スクリーンショット 2015-01-19 22.50.33.png

解決策

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”]です。

こんなの何に使うんだ?

と思われる方は多いと思いますが、私はここ一週間一生懸命こういうのを書いていました。

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13