【问题标题】:Invalid redeclaration compiler error on generic type extension泛型类型扩展上的无效重新声明编译器错误
【发布时间】:2019-07-09 11:26:09
【问题描述】:

我的问题是关于我在使用 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 恶作剧?

【问题讨论】:

  • 您不能在Swift 中声明同名的方法和属性。当使用错误的约束调用方法/属性时,where 子句将引发编译器错误,但该方法/属性将显示为任何类型的 associated 类型。
  • 似乎是一个已知的错误:bugs.swift.org/browse/SR-8123.
  • 谢谢@MartinR,我忘了检查那里,这似乎确实是一个已知的错误

标签: swift xcode dictionary generics


【解决方案1】:

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

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

我认为我们应该使这个合法化——目前我们总是考虑变量与非变量(以及函数与非函数)如果它们的重载签名冲突,不管泛型环境如何。但如果通用环境不同,IMO 允许允许重载是合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多