如何将值添加到N维字典中,而不在Swift中嵌套if-else?

如何将值添加到N维字典中,而不在Swift中嵌套if-else?,swift,Swift,例如,我有一个2D字典,它告诉我们数字的和和[2][2]==4因为2+2=4。我已经用一些值初始化了字典: var sums = [1: [1: 2, 2: 3], 2: [1: 3, 2: 4]] 现在我想在我的2D字典中插入sums[3][4]==7。我尝试了不同的插入方法,但遇到了一些问题: sums[3]?[4] = 7 // Does not work because the key 3 is not in dictionary. sums[3] = [4: 7] //

例如,我有一个2D字典,它告诉我们数字的和<代码>和[2][2]==4因为2+2=4。我已经用一些值初始化了字典:

var sums = [1: [1: 2, 2: 3], 2: [1: 3, 2: 4]]
现在我想在我的2D字典中插入
sums[3][4]==7
。我尝试了不同的插入方法,但遇到了一些问题:

sums[3]?[4] = 7     // Does not work because the key 3 is not in dictionary.
sums[3] = [4: 7]    // Does not work because if 3 exists, it would overwrite.
是的,我可以编写if-else语句,但是if-else语句的数量会随着字典维度的增加而增加。有没有快速的方法来处理这个问题

// This works but does not scale
if var innerDict = sums[3] {
    innerDict[4] = 7
} else {
    sums[3] = [4: 7]
}
您可以使用:

如果经常使用嵌套字典,则可以将其作为扩展:

protocol DictionarySubscriptable {
    associatedtype Key
    associatedtype Value
    subscript(key: Key) -> Value? { get set }
    init()
}

extension Dictionary : DictionarySubscriptable {}

extension Dictionary where Value : DictionarySubscriptable {
    subscript(_ key1: Key, key2: Value.Key) -> Value.Value? {
        get {
            self[key1]?[key2]
        }
        set {
            self[key1, default: .init()][key2] = newValue
        }
    }
}
现在您可以执行以下操作:

sums[3, 4] = 7

你说“现在我想在我的2D字典中插入和[3][4]==7”是什么意思?“不是很优雅”这是一个意见问题。即使是超人也必须一次穿一条腿的紧身衣。对不起,不是布尔值,但要让字典包含键:3,这会导致另一个字典,我想要一个键/值对4:7。谢谢!这是我一直在寻找的,但是,当我将字典缩放为3个键而不是2个键时,我不想一次又一次地重新创建此函数(4、5、6或更多键也是如此)。还有什么方法可以推广这个解决方案吗?@Kousei-Gosh,你为什么要使用这种嵌套很深的字典?IMO 2级别在某些情况下仍然可以接受,但除此之外,您应该质疑您的设计。。。也许可以使用您自己的结构(具有多个属性)作为键?如果你需要的话,你也可以考虑编写自己的树结构。不,你不能概括这个解决方案,至少不能以类型安全的方式。
sums[3, 4] = 7