我们需要在类型[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 :(得分: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
}
}
}
您的示例将生成编译器错误,但至少它不会崩溃。