2017-03-07 6 views
2

私はSwift 3(Xcode 8.2.1)のジェネリックスで遊んでいますが、なぜこれがコンパイルされないのかわかりません。私もself.updateValueを試しました...それも失敗します。ジェネリックディクショナリエラー - サブスクリプトへのあいまいな参照

extension Dictionary { 
    mutating func mergeWith<K: Hashable, V: AnyObject> (a: [K:V]) -> [K:V] { 
     for (k,v) in a { 
      self[k] = v // compile error: Ambiguous reference to member 'subscript' 
     } 
    } 
} 

私はジェネリックスKとVの種類をディクショナリで動作するように制限しようとしていますが、それはうまくいかないでしょうか?

答えて

3

これは特に有用なエラーではないのですが、問題は、あなたが新しいローカルジェネリックプレースホルダKとあなたの方法でV導入しているということです - DictionaryKeyに関連するどのような方法をする必要はありませんし、 Valueタイプ(一般的なプレースホルダは、呼び出し元であり、呼び出し先ではありません)。

これを削除して、既存の汎用プレースホルダKeyValueを代わりに使用します。つまり、[Key : Value]パラメータを使用します。または、Swift automatically infers the generic placeholdersを汎用タイプの中で参照するときは、Dictionary(これはDictionary<Key, Value>に解決されます)というパラメータを入力するだけです。

extension Dictionary { 
    mutating func merge(with dict: Dictionary) { 
     for (key, value) in dict { 
      self[key] = value 
     } 
    } 
} 

またmutating方法は、通常、変異したインスタンスを返しませんので、私はあなたのメソッドからの戻り値の型を削除しました。

+0

ありがとうございました。私は確かに、エラーメッセージが何らかのスタックの最後の部分ではなく、エラーが発生していた理由を示していることを望みます。 – xaphod

+1

@xaphodええ、残念ながら、コンパイラからの診断メッセージがまだ遠い満足できるものから。スウィフトチームでは公正だが、状況は一般的に良くなっている。怠惰なエラー/警告メッセージが出たときには、[バグレポートを提出する](https://bugs.swift.org)の価値があります - 一般的に通知されます。 – Hamish

関連する問題