泛型类型扩展无效的重新声明编译器错误

时间:2019-07-09 11:26:09

标签: swift xcode dictionary generics

我的问题是关于使用Swift处理泛型类型时遇到的一些编译器错误。

因此,在此刻,我正在尝试通过添加静态变量和函数来扩展Dictionarywhere子句的问题。 请参见下面的示例:

extension Dictionary where Key == String, Value == String {
    static func foo() -> [String: String] {
        return [
            "bar": "bar",
            "baz": "baz"
        ]
    }
}

当我以不同的通用一致性再次扩展Dictionary时,就会出现问题:

extension Dictionary where Key == String, Value == Int {
    static let foo: [String: Int] = [
            "bar": 0,
            "baz": 1
        ]
}

请注意,ValueString更改为Int,第二个扩展名中的foo被声明为let。 现在,这将显示以下编译器错误:

Invalid redeclaration of 'foo'

但是,如果我将foo的两个实现都更改为静态函数,或者将两者都更改为静态letvar,则可以正常编译。

我缺少某种Swift恶作剧吗?

1 个答案:

答案 0 :(得分:2)

这是已知的错误/限制,请参见SR-8123 – Invalid redeclaration of name when creating a func name() in a different extension of the same type with different where clause

  

但是,如果扩展定义了与另一个扩展中定义的变量同名的函数,则编译器将引发无效的重新声明错误。

  

我认为我们应该将其合法化–当前,无论通用环境如何,如果变量的重载签名发生冲突,我们始终在考虑变量与非变量(以及具有非函数的函数)之间的冲突。但是,如果通用环境不同,则IMO允许允许过载是合理的。