Недопустимая ошибка компилятора переопределения при расширении универсального типа - PullRequest
1 голос
/ 09 июля 2019

У меня вопрос о какой-то ошибке компилятора, которую я получаю при работе с универсальными типами в Swift.

Так что в данный момент я сталкиваюсь с этой проблемой, где я пытаюсь расширить Dictionary с помощьюwhere предложения путем добавления статических переменных и функций.См. Пример ниже:

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
        ]
}

Обратите внимание, что Valueизменено с String на Int, а foo во втором расширении объявлено как let.Теперь это показывает следующую ошибку компилятора:

Invalid redeclaration of 'foo'

Однако, если я изменю обе реализации foo на статическую функцию или обе на статическую let или var, он прекрасно скомпилируется.

Есть ли какие-то быстрые махинации, которые мне не хватает?

1 Ответ

2 голосов
/ 09 июля 2019

Это известная ошибка / ограничение, см. SR-8123 - Недопустимая переопределение name при создании func name() в другом расширении того же типа с другим where предложением :

Однако компилятор выдает недопустимую ошибку объявления, если расширение определяет функцию с тем же именем, что и переменная, определенная в другом расширении.

и

Я думаю, что мы должны сделать это законным - в настоящее время мы всегда рассматриваем переменные как конфликтующие с не-переменными (и функциями с не-функциями), если их сигнатуры перегрузки конфликтуют, независимо от общей среды. Но если общая среда отличается, IMO разумно разрешить перегрузку.

...