我们需要在[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])会崩溃。
编辑:我添加的扩展是泛型版本,它对带有可哈斯键和值的字典有效。如何确保这个扩展适用于[String: String]、、ONLY类型的字典。
如何确保此扩展仅对[String:String]类型的字典有效
发布于 2016-05-31 13:27:00
通过如下声明,可以将字典扩展限制为只应用于属于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
}
}
}然后,您的示例将生成编译器错误,但至少不会崩溃。
https://stackoverflow.com/questions/37546267
复制相似问题