AnyObjectをいつ使用するか、SwiftでAnyをいつ使用するかわかりません。
私の場合、私は辞書を持っています
[ストリング: ???]
??? :Int、Double、Float、String、Array、Dictionaryにすることができます
AnyとAnyObjectの違いと、私の場合にどちらを使用するかを誰かに説明してもらえますか?
アラク
回答:
AnyObjectは参照タイプ(クラス)Any専用で、値と参照タイプの両方に使用できます。
だからあなたは行くべきです[String: Any]。
AnyおよびAnyObjectの型キャスト
Swiftは、非特定の型を操作するための2つの特別な型を提供します。
Any関数タイプを含め、あらゆるタイプのインスタンスを表すことができます。AnyObject任意のクラス型のインスタンスを表すことができます。注意:
それらが提供する動作と機能を明示的に必要
AnyとAnyObjectする場合にのみ使用してください。コードで使用することが予想される型については、常に具体的にすることをお勧めします。
-
また、Cocoa APIを使用する場合、AnyObjectの配列を受け取るのが一般的です。これは、Objective-C配列が標準化されていないためです。したがって、期待する配列型にキャストする必要があります。
-
編集:(2015年12月22日)
最後のステートメントで、これはSwift 2.0およびXcode 7で変更されることに注意してください
。AppleはObjective-Cに「軽量」ジェネリックを導入したため、多くのCocoa APIはすでに正しいタイプを返します。
編集:(2016年10月18日)
Swift 3.0以降、Objective-C idはとしてAnyではなくとしてインポートされるようになりましたAnyObject。
NSStringはNSArrayありNSDictionaryませんが、同様に機能するSwiftバージョンはクラスではなく、多くの開発者をつまずかせます。
使用するか、使用目的に依存するAnyかAnyObject:
あなたの辞書は唯一スウィフトコード内で使用される場合は、使用する必要がありAny、あなたの種類のため(Int、Double、Float、String、Array、及びDictionary)オブジェクトではありません。
辞書をを期待するObjective-Cルーチンに渡す場合はNSDictionary、を使用する必要がありますAnyObject。
いつimport Foundationまたはimport UIKitかimport Cocoa、それはあなたのように配列を宣言することは可能である[String: AnyObject]が、この場合にはスウィフトが治療され、あなたのInt、Double、FloatリテラルとしてNSNumberあなた、StringSなどNSString、あなたのArrayようにS NSArray、そして、あなたの辞書NSDictionaryオブジェクトですすべてが、。AnyObject値の型としてを使用する辞書はに変換できますNSDictionaryが、を使用するものは変換Anyできません。
ジェネリックはタイプセーフです。つまり、文字列をジェネリックとして渡し、整数として使用しようとすると、コンパイラーは文句を言い、コンパイルできなくなります(これは良いことです)。(これは、Swiftが静的型付けを使用しているために発生し、コンパイラエラーが発生する可能性があります)。AnyObjectを使用する場合、コンパイラーはこのオブジェクトを文字列または整数として処理できることを理解しておらず、基本的に、これまで使用してきたオブジェクトを使用する場合と同じように、これを使用して何でも実行できます(これは悪いことです)。 Integerの場合、文字列として渡され、アプリケーションがクラッシュします。(これは、Swiftが動的型付けを使用しているために発生し、実行時エラーのみが表示されます)
String、Array及びDictionary任意のこれらの使用のために、クラスではありません。