Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 字典类型的扩展,其中键和值具有特定类型_Swift_Dictionary - Fatal编程技术网

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

Swift 字典类型的扩展,其中键和值具有特定类型,swift,dictionary,Swift,Dictionary,我们需要在类型为[String:String]的字典中添加键值对,其中我尝试添加的值可能是可选的,但我需要确保将带有具有值的可选项的对添加到字典中,而其他对则被简单地丢弃 我已尝试为此在dictionary上创建扩展 extension Dictionary { mutating func insert(stringOptinal optional : String?, forStringKey stringKey : String) { if let stringVal

我们需要在类型为
[String:String]
的字典中添加键值对,其中我尝试添加的值可能是可选的,但我需要确保将带有具有值的可选项的对添加到字典中,而其他对则被简单地丢弃

我已尝试为此在dictionary上创建扩展

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]
类型的词典


如何确保此扩展仅对类型为
[String:String]
的字典有效?

您可以通过如下声明将字典扩展限制为仅适用于
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
        }
    }
}

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

@Daij Djan Edited。希望它现在能带来更多sense@Daij-德詹。好的,更具体地说,让我们忘记用扩展名编写的方法。问题是如何创建和扩展特定于给定类型的泛型。就像数组可以接受任何泛型元素一样,我如何在这个数组上创建一个只对只接受字符串元素的数组有效的扩展呢sense@Daij-这就是我想要的。谢谢你的努力:)