AnyObjectを使用するタイミングとSwiftでAnyを使用するタイミングがわかりません。
私の場合、私は辞書を持っています
[文字列:???]
??? :Int、Double、Float、String、Array、Dictionaryのいずれか
誰かがAnyとAnyObjectの違いと私の場合にどちらを使用するかを説明できますか?.
アラク
AnyObject
は参照型(クラス)専用で、Any
は値型と参照型の両方用です。
だから、[String: Any]
に行くべきです。
AnyおよびAnyObjectの型キャスト
Swiftは、非特定型を操作するための2つの特別な型を提供します。
Any
は、関数型を含む、あらゆる型のインスタンスを表すことができます。AnyObject
は、任意のクラスタイプのインスタンスを表すことができます。注:
Any
とAnyObject
は、それらが提供する動作と機能が明示的に必要な場合にのみ使用してください。コードで使用する予定の型について具体的に説明することは常に優れています。
FromThe Swift Programming Language: https://developer.Apple.com/library/content/documentation/Swift/ Conceptual/Swift_Programming_Language/TypeCasting.html#// Apple_ref/doc/uid/TP40014097-CH22-ID342
-
また、Cocoa APIを使用する場合、AnyObjectの配列を受け取るのが一般的です。これは、Objective-C配列が一般化されていないためです。したがって、期待する配列型にキャストする必要があります。
-
EDIT:(2015年12月22日)
最後のステートメントで、これはSwift 2.0およびXcode 7で変更されていることに注意してください。
AppleはObjective-Cに 「軽量」ジェネリック を導入したため、多くのCocoa APIがすでに正しい型を返しています。
EDIT:(2016年10月18日)
Swift 3.0以降、Objective-C id
sはAny
としてではなく、AnyObject
としてインポートされることに注意してください。
Any
を使用するかAnyObject
を使用するかは、使用目的によって異なります。
辞書がSwiftコード内でのみ使用される場合、タイプ(Any
、Int
、Double
、Float
、String
、およびArray
)はオブジェクトではないため、Dictionary
を使用する必要があります。
NSDictionary
が必要なObjective-Cルーチンに辞書を渡す場合は、AnyObject
を使用する必要があります。
import Foundation
またはimport UIKit
またはimport Cocoa
を使用すると、配列を[String: AnyObject]
として宣言できますが、この場合はSwiftがInt
を処理します。 Double
、Float
リテラル、NSNumber
、String
sをNSString
、Array
sをNSArray
、辞書をNSDictionary
として、すべてオブジェクトです。値型としてAnyObject
を使用する辞書はNSDictionary
に変換できますが、Any
を使用する辞書は変換できません。
AppleのSwiftドキュメント、
詳細については、これを確認してください: Blog
ジェネリックはタイプセーフです。つまり、文字列をジェネリックとして渡し、整数として使用しようとすると、コンパイラがエラーを出し、コンパイルできなくなります(これは良いことです)。 (これはSwiftが静的型付けを使用しており、コンパイラエラーが発生する可能性があるために発生します))
AnyObjectを使用する場合、コンパイラはこのオブジェクトをStringまたはIntegerとして扱うことができ、基本的にはオブジェクトを使用しようとしているかのように(これは悪い)何でもできるようになりますアプリケーションがクラッシュする整数の場合、文字列として渡されます。 (これはSwiftが動的な型指定を使用しており、実行時エラーのみが表示されるために発生します)