コンパイルエラーが発生する理由を理解しようとしています:Type '[String、AnyObject?]' does not conform to protocol AnyObject?
var cars: [String: AnyObject?] = [ "model": "Ferrari"]
var JSON: [String: AnyObject?] = [ "cars": cars ] // <-- error
cars
はAnyObjectではないようですか?わかりません。
ご協力いただきありがとうございます!
AnyObject
はクラスでなければなりませんが、Dictionary
は構造体です。
AnyObjectは、任意のクラス型のインスタンスを表すことができます。
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
互換ではないため、この方法ではキャストできません。そのため、強制は失敗します。
車は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へのオブジェクトのキャストに影響しますか?
NSDictionary
はnil
を保持できません( 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