iOS プロジェクトを Swift に移行しています。クラスごとに実行しています。Swift から Objective C メソッドを呼び出すと、多くの Objective C 型が Swift の対応する型に変換されます。
私の場合、Objective C はNSMutableArray
Swift の に変換されますArray<AnyObject>
。ここで問題が発生します。Swift クラス内で、Objective C オブジェクトからこのような配列が返されます。Swift の世界にいる今、この配列を ではなく特定の型にキャストしたいと思いますAnyObject
。なぜなら、この配列にどのようなオブジェクトが存在するかを確実に知っているからです。
コンパイラはそれを許可しません。文字列を含む配列にキャストしたいと言って問題を単純化しましょう。これが私が試したことです:
var strings = myObjcObject.getStrings() as [String]
コンパイラから次のエラーが発生します。
「文字列」は「AnyObject」と同じではありません
String は確かに AnyObject と同一ではないので、コンパイラーに同意せざるを得ません。しかし、それがなぜ問題なのかわかりません。必要なら AnyObject を String にダウンキャストできますよね?
私も試しました:
var strings = myObjcObject.getStrings() as? [String]
これは正しい方向への一歩のように思えますが、getStrings() は を返すNSMutableArray
ため、次のエラーが発生します。
「NSArray」は「NSMutableArray」のサブタイプではありません
ここで私がやろうとしていることを実行する方法はありますか?
ベストアンサー1
NSArray
これを動作させるには、最初に、次に という二重のダウンキャストを実行します[String]
。
var strings = myObjcObject.getStrings() as NSArray as [String]
プレイグラウンドでテスト済み:
import Foundation
var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as [String]
アップデート:
Swift のそれ以降のバージョン (少なくとも 1.2) では、コンパイラは についてエラーを出しますas [String]
。代わりに、if let
条件付きダウンキャスト を使用した を使用する必要がありますas?
。
import Foundation
var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
if let swiftArray = objCMutableArray as NSArray as? [String] {
// Use swiftArray here
}
あなたがいる場合絶対にNSMutableArray
を にキャストできることを確認し[String]
たら、代わりに を使用できますas!
(ただし、ほとんどの場合、これを使用すべきではありません)。
import Foundation
var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as! [String]