SwiftとObjective-Cのクラスは、相互にキャストできるものがあります。
Objective-Cのクラスにあるメソッドを使いたい時などに、キャストすることも結構あります。
もともとObjective-Cで書いていたアプリを引き続きSwiftで開発するときなども、キャストする場面にあたります。
しかし、スムーズにいかないこともあります。
配列を操作するときに何度か問題が起きたので、備忘録としてぼくの注意点と対処方を記事にしておきます。
SwiftのArrayは型を複数持てないので、Objective-CのNSArrayからキャストするときにエラーが起こる場合があります。
これでたまにエラーになることがありました。
以下のような場合です。
let nsarray : NSArray = [ 1.0, 5 ,”String” ] // 複数の型を使う
var array1 : [String] = nsarray as [String] // エラー
そういったことを考慮して、安全に変換する方法は該当する型だけを配列として抽出するかas?でオプショナル構文としてチェックするかする方が良さそうです。
例えば、String型の配列としてNSArrayをキャストするときには、以下のようにします。
if let array2 : [String] = nsarray as? [String] { // オプショナル構文
}
// 抽出する方法 1
var array3 = [String]()
for obj in nsarray {
if let str = obj as? String {
array3.append(str)
}
}
// 抽出する方法 2
var array4 = ( nsarray as [AnyObject] ).filter{ $0 is String }