2016-03-25 4 views
0

意味的に言えば、[String:AnyObject?][String:AnyObject]は、同じように動作します。つまり、設定されていないキーにアクセスし、キーをnilに設定すると、同じキーが辞書から削除されます。 。なぜ彼らは同じタイプと見なされないのですか?[String:AnyObject?]および[String:AnyObject]は、高速コンパイラと同じ型ではないのはなぜですか?

EDIT:答えからのコンパイラの視点との違いを理解しています。私が遊び場に次のコードを置くことにしました:

var optional = [String:AnyObject?]() 
var regular = [String:AnyObject]() 

//Some control keys 
optional["controlkey"] = "valueoptional" 
regular["controlkey"] = "valueRegular" 

//Set the keys 
optional["keyOptional"] = "valueoptional" 
regular["keyRegular"] = "valueRegular" 

//Unset the keys 
optional["keyOptional"] = nil 
regular["keyRegular"] = nil 

for (key,val) in optional { 
    print("key: \(key)\tval: \(val)") 
} 

for (key,val) in regular { 
    print("key: \(key)\tval: \(val)") 
} 

驚いたことに、オプションがnilに設定したキーを印刷しませんでした。 出力は以下の通りであった:

key: controlkey val: Optional(valueoptional) //The keys for the optional dictionary 
key: controlkey val: valueRegular //The keys for the `regular` dictionary 

なぜ私が現れnilに設定されていない重要なのですか?

答えて

1

null可能な型とnull以外の型は、コンパイラの観点から同じものではないためです。 Dictionnaryインターフェイスは最終的に同様のエンティティで「ブレンド」されますが、実際には型システムではなく、Dictionnary実装とリンクされています。

EDIT:このアップデートでは質問のコンテキストが変更されますが、設定をnilに設定することは私の理解から解除する方法です。アップルのドキュメントから

+0

私はもう少しお尋ねしました! – Quantaliinuxite

1

スウィフト言語は後置を定義しますか?スレーブ標準 ライブラリで定義されている という名前のタイプのオプションの構文糖として。

タイプAnyObject?存在しないかもしれない値を表すために使用されるNoneとSome(Wrapped)の2つのケースを持つ列挙体です。しかし、AnyObjectは提示されるものに応答しています。

辞書のキーにnilを設定すると、要素自体が削除されます。 nilにキーを設定すると、辞書からそのキーを削除するのでNSNull()

optional["keyOptional"] = NSNull() 
+0

もう少しお尋ねしました! – Quantaliinuxite

0

を設定してみてください! documentation

自己が存在しないキーを読み取ると、nilが返されます。指定したキーの値としてnilを書き込むと、そのキーは自己から消去されます

辞書値としてnilを保存することはできません。あなたは虚無を表す何かが必要な場合は、NSNullを使用します。

optional["keyOptional"] = NSNull() 
regular["keyRegular"] = NSNull() 
+0

だから、それは実装の決定ですか?面白い – Quantaliinuxite

+0

それは間違っている、あなたは素早くスウィフト辞書に 'nil'を保存することができます。下付き文字は使用できません。 – Sulthan

1

あなたが実際に[String:AnyObject?]nilを保存することができますので、彼らが異なっています。その1は、nilのための特別な行動を持っているので、あなたはoptional[key] = value(添字演算子)を使用して、それを行うことはできません(値を削除します)が、あなたはそれを行うことができます:もちろん

var optional: [String:AnyObject?] = ["test": nil] 
optional.updateValue(nil, forKey: "test2") 

print(optional) // ["test2": nil, "test": nil] 

、そのような辞書から値を取得:

print(optional["test"]) // Optional(nil) 

は、オプションのOptional<Optional<AnyObject>>(またはAnyObject??)となります。そのようなタイプとのやり取りは面倒ですので、nilを辞書に保存しないようにしてください。

0

これらは同じ型ではないため、同じ型ではありません;-)コンパイラはそのようなリテラルな生き物です。

@スルタンの答えは正確で完全です - 私は自分の答えで投稿を打つまで、私はそれを見ませんでした。しかし、[String: AnyObject?]ディクショナリでキーを検索し、値が存在する場合は、オプションでラップされます(結果はAnyObject??)。

var optional = [String: AnyObject?]() 

// I changed it to NSString because String isn't an AnyObject 
          v 
optional["controlkey"] = NSString(string: "valueoptional") 

print(optional["controlkey"]) // prints "Optional(Optional(valueoptional))" 
if let val = optional["controlkey"] { 
    print(val)     // prints "Optional(valueoptional)" 
    if let unwrappedVal = val { 
     print(unwrappedVal)  // prints "valueoptional" 
    } 
} 
+1

これらは 'nil'に対して同じ動作をしません。 – Sulthan

+0

あなたは正しいです - 私は私の答えを編集します。 –

関連する問題