Swift Dictionary 的非下标 getter 访问方法

问题描述 投票:0回答:1

我正在尝试覆盖自定义词典类型的默认下标函数。某些键永远不应该具有某些类型的值,因此我想允许/拒绝下标设置器中的值。

(这可能是一个 XY 问题,所以我对替代方法感兴趣,但这个问题仍然存在。)

下标扩展似乎对于 setter 来说工作得很好,因为可以使用

updateValue(_:forKey:)
来代替下标 setter(否则会导致无限递归)。

struct MyData {
    var isBadData: Bool
}

extension Dictionary where Key == String, Value == MyData {
    
    subscript(key: Key) -> Value? {
        // Omitting getter results in ERROR: Subscript with a setter must also have a getter
        get {
            return self[key] // WARNING: Function call causes an infinite recursion
            // is there a non-subscript getter alternative?
        }
        set(newValue) {
            if let newValue {
                if newValue.isBadData {
                    return // do not add bad data to dictionary
                } else {
                    //self[key] = newValue // WARNING: Function call causes an infinite recursion
                    
                    updateValue(newValue, forKey: key) // non-subscript setter alternative works
                }
            } else {
                removeValue(forKey: key)
            }
        }
    }
}

但是对于getter,我不知道如何

get
从字典中获取值而不递归调用下标getter。

NSDictionary has

value(forKey:)
但在 Swift Dictionary 文档中似乎没有类似的非下标替代方案。

如何在不使用下标的情况下获取字典值?或者有没有办法以某种方式在下标上调用

super
以使用原始实现?

swift dictionary extension-methods subscript
1个回答
0
投票

您可以使用基于

Dictionary.Index
的下标

get {
    if let i = index(forKey: key) {
        return self[i].value
    }
    
    return nil
}

也就是说,您不应该编写

extension
Dictionary
更改其现有功能。这不是扩展的目的,您可能会通过做一些他们不期望的事情来让代码的用户感到惊讶。 您应该创建自己的

Dictionary

包装类型,或者添加带有参数标签的下标,以便与内置下标区分开来。

subscript(noBadData key: Key) -> Value?

© www.soinside.com 2019 - 2024. All rights reserved.