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
あなた、String
SなどNSString
、あなたのArray
ようにS NSArray
、そして、あなたの辞書NSDictionary
オブジェクトですすべてが、。AnyObject
値の型としてを使用する辞書はに変換できますNSDictionary
が、を使用するものは変換Any
できません。
ジェネリックはタイプセーフです。つまり、文字列をジェネリックとして渡し、整数として使用しようとすると、コンパイラーは文句を言い、コンパイルできなくなります(これは良いことです)。(これは、Swiftが静的型付けを使用しているために発生し、コンパイラエラーが発生する可能性があります)。AnyObjectを使用する場合、コンパイラーはこのオブジェクトを文字列または整数として処理できることを理解しておらず、基本的に、これまで使用してきたオブジェクトを使用する場合と同じように、これを使用して何でも実行できます(これは悪いことです)。 Integerの場合、文字列として渡され、アプリケーションがクラッシュします。(これは、Swiftが動的型付けを使用しているために発生し、実行時エラーのみが表示されます)
String
、Array
及びDictionary
任意のこれらの使用のために、クラスではありません。