我正在尝试覆盖自定义词典类型的默认下标函数。某些键永远不应该具有某些类型的值,因此我想允许/拒绝下标设置器中的值。
(这可能是一个 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
以使用原始实现?
Dictionary.Index
的下标。
get {
if let i = index(forKey: key) {
return self[i].value
}
return nil
}
也就是说,您不应该编写
extension
的 Dictionary
来更改其现有功能。这不是扩展的目的,您可能会通过做一些他们不期望的事情来让代码的用户感到惊讶。
您应该创建自己的 Dictionary
包装类型,或者添加带有参数标签的下标,以便与内置下标区分开来。
subscript(noBadData key: Key) -> Value?