AnyObjectとAny in Swift


91

AnyObjectをいつ使用するか、SwiftでAnyをいつ使用するかわかりません。

私の場合、私は辞書を持っています

[ストリング: ???]

??? :Int、Double、Float、String、Array、Dictionaryにすることができます

AnyとAnyObjectの違いと、私の場合にどちらを使用するかを誰かに説明してもらえますか?

アラク

回答:


114

AnyObjectは参照タイプ(クラス)Any専用で、値と参照タイプの両方に使用できます。

だからあなたは行くべきです[String: Any]

AnyおよびAnyObjectの型キャスト

Swiftは、非特定の型を操作するための2つの特別な型を提供します。

  • Any 関数タイプを含め、あらゆるタイプのインスタンスを表すことができます。
  • AnyObject 任意のクラス型のインスタンスを表すことができます。

注意:

それらが提供する動作と機能を明示的に必要AnyAnyObjectする場合にのみ使用してください。コードで使用することが予想される型については、常に具体的にすることをお勧めします。

スウィフトプログラミング言語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配列が標準化されていないためです。したがって、期待する配列型にキャストする必要があります。

-

編集:(2015年12月22日)
最後のステートメントで、これはSwift 2.0およびXcode 7で変更されることに注意してください
。AppleはObjective-Cに「軽量」ジェネリックを導入したため、多くのCocoa APIはすでに正しいタイプを返します。

編集:(2016年10月18日)
Swift 3.0以降、Objective-C idはとしてAnyではなくとしてインポートされるようになりましたAnyObject


18
なおStringArray及びDictionary任意のこれらの使用のために、クラスではありません。
zaph 2014

6
Int、Double、Floatもそうではありません。
Teejay

11
ええ、しかしそれは通常明白です。、それがクラスであることはそれほど明白でNSStringNSArrayありNSDictionaryませんが、同様に機能するSwiftバージョンはクラスではなく、多くの開発者をつまずかせます。
zaph 2014

1
Anyもオプションを表しますか?それともAnyと表現する必要がありますか?

1
@robdashnash Anyはオプションを表しません。?オプションにするために追加する必要があります
crypt

46

使用するか、使用目的に依存するAnyAnyObject

あなたの辞書は唯一スウィフトコード内で使用される場合は、使用する必要がありAny、あなたの種類のため(IntDoubleFloatStringArray、及びDictionary)オブジェクトではありません。

辞書をを期待するObjective-Cルーチンに渡す場合はNSDictionary、を使用する必要がありますAnyObject

いつimport Foundationまたはimport UIKitimport Cocoa、それはあなたのように配列を宣言することは可能である[String: AnyObject]が、この場合にはスウィフトが治療され、あなたのIntDoubleFloatリテラルとしてNSNumberあなた、StringSなどNSString、あなたのArrayようにS NSArray、そして、あなたの辞書NSDictionaryオブジェクトですすべてが、。AnyObject値の型としてを使用する辞書はに変換できますNSDictionaryが、を使用するものは変換Anyできません。


1

AppleのSwiftドキュメントによると、

  • Anyは、関数タイプやオプションのタイプを含め、あらゆるタイプのインスタンスを表すことができます。
  • AnyObjectは、任意のクラス型のインスタンスを表すことができます。

詳しくはこちらをご覧ください:ブログ


1

このSOの答えを確認してください

ジェネリックはタイプセーフです。つまり、文字列をジェネリックとして渡し、整数として使用しようとすると、コンパイラーは文句を言い、コンパイルできなくなります(これは良いことです)。(これは、Swiftが静的型付けを使用しているために発生し、コンパイラエラーが発生する可能性があります)。AnyObjectを使用する場合、コンパイラーはこのオブジェクトを文字列または整数として処理できることを理解しておらず、基本的に、これまで使用してきたオブジェクトを使用する場合と同じように、これを使用して何でも実行できます(これは悪いことです)。 Integerの場合、文字列として渡され、アプリケーションがクラッシュします。(これは、Swiftが動的型付けを使用しているために発生し、実行時エラーのみが表示されます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.