web-dev-qa-db-ja.com

NSArrayをSwift Array <T>に変換

CoreDataでordered対多の関係を定義しました。この関係はSwiftで次のように定義されています:

_@NSManaged var types : NSMutableArray
_

ただし、Swift=最高の状態で使用するには、通常のSwift _Type[]_のような配列を使用します。ただし、CoreDataではNS(Mutable)ArrayNSArrayを_Array<Type>[]_に型キャスト/変換するにはどうすればよいですか?

混乱は次のエラーから生じているようです。

_let array = obj.types as T[] // Cannot convert expression's type 'Node[]' to type '$T2'
_

これはエディターによって受け入れられますが:

_let array = obj.types as AnyObject[] as T[] // No complaint
_
29
Bouke

現在obj.types.allObjects as Type[]を使用していますが、それはハック/回避策のように感じます。

その後、あなたの気持ちを修正します。あなたがやっているのは、まさにあなたがdoNSArrayArray<Type>[]に型キャスト/変換する方法」です。

NSArrayは常にSwiftを含むAnyObject(つまりArray<AnyObject>、別名AnyObject[])に到達します。わかっている場合は特定の型にキャストします。それはすべて1つのタイプを含み、あなた次第であり、あなたがそれをどのように行うかはまさにあなたがすべきことです。

[〜#〜] edit [〜#〜] Swift 2.0および新しいiOS 9 APIでは、NSArrayは正しく入力された状態で届くことが多く、キャストは行われません。必要です。

EDIT 2 In Swift 3.0、まれにですが、正しく入力されていないNSArrayは、Anyの代わりにAnyObjectを含むものとして到着します。それでも特定のタイプにキャストする必要があります。

14
matt

以下は、私のプロジェクトの1つで役立つ可能性のある作業コードです。

if let rawArray = rawData as? NSArray,
   let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
   { 
       // etc... 
   }

最適と考えられるかどうかはわかりませんが、動作します。

2

そのように列挙します:

for type in types.array {
    // Do something
}

または、使用しているarrayNSOrderedSetプロパティを次のように使用します。

types.array
1
Vaseltior

新しい汎用配列を作成し、次のように手動で移入する必要があります。

    var result = Type[]()

    for item : AnyObject in self {
        //  Keep only objC objects compatible with OutType
        if let converted = bridgeFromObjectiveC(item, Type.self) {
            result.append(converted)
        }
    }
0
ColinE