web-dev-qa-db-ja.com

タイプ '[String、AnyObject?]'はプロトコルAnyObject?に準拠していません:なぜですか?

コンパイルエラーが発生する理由を理解しようとしています:Type '[String、AnyObject?]' does not conform to protocol AnyObject?

var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ]  // <-- error

carsはAnyObjectではないようですか?わかりません。

ご協力いただきありがとうございます!

15
Kamchatka

AnyObjectはクラスでなければなりませんが、Dictionaryは構造体です。

Swiftプログラミング言語:型キャスト

AnyObjectは、任意のクラス型のインスタンスを表すことができます。

Swiftプログラミング言語:クラスと構造

Swiftの文字列型、配列型、および辞書型は、構造体として実装されています。


この目的で_Any?_を使用できます。

_var cars: [String: Any?] = [ "model": "Ferrari"]
var JSON: [String: Any?] = [ "cars": cars ]
_

これをもう少し見てみると、微妙な問題があり、これが壊れてしまいます。

動作するサンプルは次のとおりです。

_var cars: [String: AnyObject] = [ "model": "Ferrari"]
var JSON: [String: AnyObject] = [ "cars": cars ]
_

これは、carsが_[String: AnyObject]_からNSDictionary ([AnyHashable: AnyObject])と互換性のあるオブジェクトに強制変換(暗黙的にキャスト)されているために機能します。次に、このNSDictionary互換オブジェクトをAnyObjectにキャストします。だから、魔法。

_[String: AnyObject?]_はNSDictionary互換ではないため、この方法ではキャストできません。そのため、強制は失敗します。

24
Jeffery Thomas

車はAnyObjectではないようですか?

タイプ[String: AnyObject?]としてcarsを定義したため、次のコードが有効です(プレイグラウンドでテスト済み):

var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: [String: AnyObject?]] = [ "cars": cars ]

タイプ[String: AnyObject?]または[String: Any?](必要に応じて)としてJSONを定義する必要があるのは、タイプcarsがどのタイプかを推測できない場合のみです( AnyおよびAnyObjectの型キャスト inThe Swiftプログラミング言語)。

NSDictionaryへのオブジェクトのキャストに影響しますか?

NSDictionarynilを保持できません( here または here を参照)。次のコードは、Playgroundにエラーメッセージを表示します。

var nsDict1: NSDictionary = [12 : 10, 10 : nil] //eror message

var cars: [String: AnyObject?] = [ "model" : nil]
var JSON: [String: [String: AnyObject?]] = [ "cars" : cars ]
let nsDict2 = JSON as NSDictionary //error message

ただし、次のコードは有効です。

var nsDict1: NSDictionary = [12 : 10, 10 : NSNull()] //no error message

var cars: [String: AnyObject] = [ "model" : "Ferrari"] //also works with [ "model" : NSNull()]
var JSON: [String: [String: AnyObject]] = [ "cars" : cars ]

let nsDict2 = JSON as NSDictionary //no error message
3
Imanou Petit