Перегрузить словарь в нижнем индексе два раза и переадресовать вызов - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь расширить 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

Это ограничение Swift?Или я что-то упустил?

Я использую Xcode 10.2 beta 2.

PS Я знаю, что есть и другие альтернативы, такие как выделенные функции или объединение нулей, пытаясь понять, что пошло не такв этой конкретной ситуации.

1 Ответ

0 голосов
/ 15 февраля 2019

У подписчиков есть другие правила, чем у функций, когда дело доходит до меток аргументов.Для функций в качестве меток аргументов по умолчанию используется имя параметра - например, если вы определите:

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