特に章分けするほどのものでもないので、単刀直入に言います。
御存知の通り、Swift は型推論があります。また、便利な配列型があります。しかしこれらは意外な落とし穴があります。試しに Playground とかで下記のコードを打ってみましょう:
let testString = "test"
let testFlag = true
let testInt = 1
let testArray = [testString, testFlag, testInt]
はい、一見何の変哲もないごくごく普通な Swift コードですね。それでは、最後のこの一行も追加してみましょう
let testAny = testArray[0] as Any
おそらく入力し終わった途端、Playground にこのように怒られます:
(ちなみに Playground ではなく普通のプログラムに入れちゃうとコンパイルエラーかランタイムエラーになります。)
実は最後の「as Any」を削除しちゃえば普通に動くコードなんですよね…ではなぜ「as Any」を入れちゃうとこうなっちゃうでしょうか?試しに最後の「as Any」を削除してみましょう。そうすると下記のような警告が出るはずです:
はい、「testAny」を「AnyObject」としてちゃんと宣言しましょうね、ということです。あれれ?おかしいな?testArray の 0 番目の要素はただの String なのになんで Object に?それは実は testArray の宣言に問題があったのです。試しに opt 押しながら testArray をクリックしてみましょう、下記のような情報が出るはずです:
はい、実はこの testArray、なんと「NSArray」として宣言されちゃったのです。つまり複数の種類の型を同一配列に入れる宣言はデフォルトでは NSArray として宣言されることです。
でも普通我々が望んでいるのは NSArray ではなく、普通に Swift の配列型として宣言して欲しいですよね?じゃあどうすればいいでしょうか?答えは簡単です、下記のように宣言しちゃいなよ、ゆー
let testArray: [Any] = [testString, testFlag, testInt]
まあでも真面目な話、多分これ、Xcode のせいですよね…また今後使用変更しそうです。