web-dev-qa-db-ja.com

AnyObjectとAny in Swift

AnyObjectを使用するタイミングとSwiftでAnyを使用するタイミングがわかりません。

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

[文字列:???]

??? :Int、Double、Float、String、Array、Dictionaryのいずれか

誰かがAnyとAnyObjectの違いと私の場合にどちらを使用するかを説明できますか?.

アラク

86
Alak

AnyObjectは参照型(クラス)専用で、Anyは値型と参照型の両方用です。

だから、[String: Any]に行くべきです。

AnyおよびAnyObjectの型キャスト

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

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

注:

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

FromThe Swift Programming Languagehttps://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 idsはAnyとしてではなく、AnyObjectとしてインポートされることに注意してください。

106
Teejay

Anyを使用するかAnyObjectを使用するかは、使用目的によって異なります。

辞書がSwiftコード内でのみ使用される場合、タイプ(AnyIntDoubleFloatString、およびArray)はオブジェクトではないため、Dictionaryを使用する必要があります。

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

import Foundationまたはimport UIKitまたはimport Cocoaを使用すると、配列を[String: AnyObject]として宣言できますが、この場合はSwiftがIntを処理します。 DoubleFloatリテラル、NSNumberStringsをNSStringArraysをNSArray、辞書をNSDictionaryとして、すべてオブジェクトです。値型としてAnyObjectを使用する辞書はNSDictionaryに変換できますが、Anyを使用する辞書は変換できません。

45
vacawama

AppleのSwiftドキュメント、

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

詳細については、これを確認してください: Blog

1
Rohit Sisodia

ジェネリックはタイプセーフです。つまり、文字列をジェネリックとして渡し、整数として使用しようとすると、コンパイラがエラーを出し、コンパイルできなくなります(これは良いことです)。 (これはSwiftが静的型付けを使用しており、コンパイラエラーが発生する可能性があるために発生します))

AnyObjectを使用する場合、コンパイラはこのオブジェクトをStringまたはIntegerとして扱うことができ、基本的にはオブジェクトを使用しようとしているかのように(これは悪い)何でもできるようになりますアプリケーションがクラッシュする整数の場合、文字列として渡されます。 (これはSwiftが動的な型指定を使用しており、実行時エラーのみが表示されるために発生します)

0
Ved Rauniyar