2016-05-31 41 views
2

我們需要在類型[String:String]的字典中添加鍵值對,其中我嘗試添加的值可能是可選的,但我需要確保與具有值的選項對被添加到字典中,而其他的則被簡單地丟棄。字典類型的擴展,其中鍵和值具有特定類型

我試圖在字典上爲此創建擴展。

extension Dictionary { 
    mutating func insert(stringOptinal optional : String?, forStringKey stringKey : String) { 
     if let stringValue = optional { 
      self[stringKey as! Key] = stringValue as? Value 
     } 
    } 
} 

var dictionary = ["1":"One","2":"Two"] 

var serverFetchedStringWithString : String? = "Some String From Server,That ay or may not exists" 
var serverFetchedStringWithNil : String? 

//Added as key value pair 
dictionary.insert(stringOptinal: serverFetchedStringWithString, forStringKey: "3") 
// Not added 
dictionary.insert(stringOptinal: serverFetchedStringWithNil, forStringKey: "4") 

print(dictionary) 

var dictionaryOfIntString = [1:"One",2:"Two"] 
//An obvious crash as we are trying to insert [String:String] to a dictionary of [Int,String] 
dictionaryOfIntString.insert(stringOptinal: serverFetchedStringWithString, forStringKey: "3") 

這適用於[String:String]類型的所有字典。但類型更改時崩潰(例如[Int:String])。

編輯:我已經添加的擴展是通用版本,它適用於帶有Hashable鍵和值的字典。如何確保此擴展程序適用於[String: String]類型的字典僅限於

如何確保此擴展程序僅對類型爲[String:String]的字典有效?

+0

@ Daij-Djan編輯!希望它現在更有意義 – BangOperator

+0

@ Daij-Djan。好吧,爲了更具體,讓我們忘記擴展中編寫的方法。問題是如何在一個專門針對給定類型的泛型上創建和擴展。像數組可以採用任何通用元素,我怎麼才能在這個數組上創建一個擴展,它只適用於僅包含字符串元素的數組? – BangOperator

+0

與第二次編輯它是有道理的 –

回答

2

你可以限制你的字典擴展模塊,僅工作通過聲明它這樣適用於那些StringLiteralConvertable鍵和值:

extension Dictionary where Key: StringLiteralConvertible, Value: StringLiteralConvertible { 
    mutating func insert(stringOptinal optional : String?, forStringKey stringKey : String) { 
     if let stringValue = optional { 
      self[stringKey as! Key] = stringValue as? Value 
     } 
    } 
} 

你的榜樣,然後將生成一個編譯器錯誤,但至少它不會崩潰。

+0

@ Daij-Djan這就是我想要的。謝謝你的努力:) – BangOperator