字典类型的扩展,其中键和值具有特定类型

时间:2016-05-31 12:50:26

标签: swift dictionary

我们需要在类型[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]类型的词典有效?

1 个答案:

答案 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
        }
    }
}

您的示例将生成编译器错误,但至少它不会崩溃。