2017-03-07 59 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

這不是一個特別有幫助的錯誤,但問題是,你將在你的方法當地通用的佔位符KV - 這不需要在相關的任何方式DictionaryKeyValue類型(請記住,通用佔位符由調用者滿足,而不是被調用者)。

所以只是單純地將其刪除,並使用現有的通用佔位符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是的,不幸的是,仍然有很多情況下,來自編譯器的診斷消息遠從滿意。儘管在Swift團隊中公平,但情況通常會好轉。當你遇到糟糕的錯誤/警告消息時,它可能值得[提交錯誤報告](https://bugs.swift.org) - 它們通常會被注意到。 – Hamish