kitoko552.memo

kitoko552のメモ

Swiftの配列をNSMutableArrayに変換する

要点

  • Swiftの配列をNSMutableArrayに変換するには、NSMutableArray(array:)を使います。

前提

Objective-C時代に活躍したNSArrayやNSMutableArrayは、Swiftではほぼ使いません。
しかし、コードがObjective-CとSwiftの共存であるプロジェクトでは、SwiftでNSMutableArrayを扱わなければならないときがあります。

直感的に

Swiftの配列をNSMutableArrayに変換しようと思ったときに、こんな感じでいけるんじゃないかなと思ってしまいます。

if let array = swiftArray as? NSMutableArray {
  // Do something
}

しかし、これではコンパイルエラーとなります。
エラーメッセージには、"swiftの配列のNSMutableArrayへの変換は必ず失敗します。"的な内容の英語が表示されます。

そうなると今度は

こんな感じに書けばいけるでしょ。とこう書きたくなります。

if let array = swiftArray as NSArray as? NSMutableArray {
  // Do something
}

一度NSArrayをかませてからNSMutableArrayに変換しようという試みです。
これはコンパイルエラーになりません。
しかし残念ながら、上の例ではキャストに失敗してしまいます。

結局

実は、NSMutableArrayのイニシャライザにSwiftの配列を引数にとったものがあります(NSArrayにもあります)。
要するにこいつを使うと一発でSwiftの配列をNSMutableArrayに変換することができます。

let array = NSMutableArray(array: swiftArray)

ちなみに

Swiftの配列とNSArrayやNSMutableArrayには、大きな違いがあります。
それは、Swiftの配列が値型であるのに対して、NSArray, NSMutableArrayは参照型ということです。
使っている側からしたら同じ配列の機能を持ったもののように感じますが、全くの別物であると考えていいでしょう。

おわり