2016-05-31 53 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