2つのDictionary
オブジェクトをマージしようとしています。彼らは両方のkey
ためvalue
を持っているとき、私は例外のカップルと、最初のを上書きするために第2のDictionay
の値をしたいと思います:"_"型を参照するエラー: "'[値]'型の値を '_?'に割り当てることができません"
- 両方の値が
Dictionary
オブジェクトであるとき、私はあることを彼らが欲しいです再帰的に同じメソッドを使用してマージされます。 - 両方の値が
Array
のオブジェクトの場合、それらを連結したいと思います。
次のように私のコードは次のとおりです。
extension Dictionary where Key:Hashable, Value:AnyObject {
func merge(with second: [Key : Value]) -> [Key : Value] {
var resultDictionary = self
for (key, value) in second {
switch value {
case let newDict as [Key : Value]:
if let oldDict = resultDictionary[key] as? [Key : Value] {
resultDictionary[key] = oldDict.merge(with: newDict) // 1
} else {
resultDictionary[key] = newDict // 2
}
case let newArray as [Value]:
if let oldArray = resultDictionary[key] as? [Value] {
resultDictionary[key] = oldArray + newArray // 3
} else {
resultDictionary[key] = newArray // 4
}
default:
resultDictionary[key] = value
}
}
return resultDictionary
}
}
私はコメント行に取得しています:期待される引数の型に:「[値キー]」
- は、型の値を変換できません。 '[_:_]'
- タイプ '[Key:Value]'の値を '_'に割り当てることはできません。
- タイプ '[値]'の値を '_'型に割り当てることができません。
- タイプ '[値]'の値を '_'型に割り当てることができません。
これらのすべてのエラーは、非常に密接に関連していない場合、同じだと思います。ここではアンダースコアがタイプとして使われているようですが、私はこの意味での意味ではありません。私は、アンダースコアは未使用の変数を示すためにのみ使用されたと考えました。
ここでアンダースコアは、型が不可能であることが多いため、型を一意に決定できないことを意味します。 Sulthanが指摘しているように、あなたのケースでは、最初の 'case 'が機能するために' Value'は '[Key:Value]'と等価でなければなりません。これは不可能です(型を無限に再帰的にします)。だから、エラーメッセージに '_'をつけることになります。 –
'Key:Hashable'という制約は冗長です。これは' struct Dictionary'で既に必要です。 –