代码之家  ›  专栏  ›  技术社区  ›  Cristik

重载字典下标两次并转发调用

  •  1
  • Cristik  · 技术社区  · 5 年前

    我正在努力扩展 Dictionary subscript 函数,一个带默认值,一个不带:

    extension Dictionary {
    
        subscript<T>(_ key: Key, as type: T.Type, defaultValue: T?) -> T? {
            // the actual function is more complex than this :)
            return nil
        }
    
        subscript<T>(_ key: Key, as type: T.Type) -> T? {
            // the following line errors out:
            // Extraneous argument label 'defaultValue:' in subscript
            return self[key, as: type, defaultValue: nil]
        }
    }
    

    下标中的无关参数标签“defaultValue:”

    enter image description here

    我使用的是Xcode 10.2 beta 2。

    另外,我知道还有其他替代方案,比如专用函数或零合并,试图了解在这种特殊情况下出现了什么问题。

    1 回复  |  直到 5 年前
        1
  •  6
  •   Hamish    5 年前

    对于参数标签,下标与函数有不同的规则。对于函数,参数标签默认为参数名称,例如,如果您定义:

    func foo(x: Int) {}
    

    foo(x: 0) .

    但是对于下标,默认情况下参数没有参数标签。因此,如果您定义:

    subscript(x: Int) -> X { ... }
    

    你可以称之为 foo[0] 而不是 foo[x: 0] .

    因此,在下标示例中:

    subscript<T>(_ key: Key, as type: T.Type, defaultValue: T?) -> T? {
        // the actual function is more complex than this :)
        return nil
    }
    

    defaultValue: 参数没有参数标签,这意味着下标必须作为 self[key, as: type, nil] . 要添加参数标签,需要指定两次:

    subscript<T>(key: Key, as type: T.Type, defaultValue defaultValue: T?) -> T? {
        // the actual function is more complex than this :)
        return nil
    }