7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

配列宣言時型推論の意外な落とし穴

Posted at

特に章分けするほどのものでもないので、単刀直入に言います。

御存知の通り、Swift は型推論があります。また、便利な配列型があります。しかしこれらは意外な落とし穴があります。試しに Playground とかで下記のコードを打ってみましょう:

let testString = "test"
let testFlag = true
let testInt = 1

let testArray = [testString, testFlag, testInt]

はい、一見何の変哲もないごくごく普通な Swift コードですね。それでは、最後のこの一行も追加してみましょう

let testAny = testArray[0] as Any

おそらく入力し終わった途端、Playground にこのように怒られます:
スクリーンショット 2015-01-09 18.30.18.png
(ちなみに Playground ではなく普通のプログラムに入れちゃうとコンパイルエラーかランタイムエラーになります。)

実は最後の「as Any」を削除しちゃえば普通に動くコードなんですよね…ではなぜ「as Any」を入れちゃうとこうなっちゃうでしょうか?試しに最後の「as Any」を削除してみましょう。そうすると下記のような警告が出るはずです:
スクリーンショット 2015-01-09 18.32.02.png

はい、「testAny」を「AnyObject」としてちゃんと宣言しましょうね、ということです。あれれ?おかしいな?testArray の 0 番目の要素はただの String なのになんで Object に?それは実は testArray の宣言に問題があったのです。試しに opt 押しながら testArray をクリックしてみましょう、下記のような情報が出るはずです:
スクリーンショット 2015-01-09 18.34.57.png

はい、実はこの testArray、なんと「NSArray」として宣言されちゃったのです。つまり複数の種類の型を同一配列に入れる宣言はデフォルトでは NSArray として宣言されることです。

でも普通我々が望んでいるのは NSArray ではなく、普通に Swift の配列型として宣言して欲しいですよね?じゃあどうすればいいでしょうか?答えは簡単です、下記のように宣言しちゃいなよ、ゆー

let testArray: [Any] = [testString, testFlag, testInt]

まあでも真面目な話、多分これ、Xcode のせいですよね…また今後使用変更しそうです。

7
7
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
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?