Общий индекс с ограничениями на связанный тип приводит к невозможности индексации значения типа

Используя Swift 4.2, я пытаюсь написать общую систему, чтобы избавиться от строк в качестве ключа словарей, чтобы вместо этого использовать перечисления.

Вот с чем я пришел:

extension Dictionary where Key == String {
    subscript<T : RawRepresentable>(key: T) -> Value? where T.RawValue == String {
        get { return self[key.rawValue] }
        set { self[key.rawValue] = newValue }
    }
}

Это компилируется и предназначено для использования любого типа RawRepresentable с необработанным значением String в качестве ключа для индекса для каждого Dictionary с String в качестве ключа.

К сожалению, когда я делаю следующее, он не компилируется:

enum MovieKey: String {
    case movieId = "movie_id"
    case movies = "movies"
}

var dic = [String:String]()
dic[key: MovieKey.movieId] = "abc123" // error

Я получаю следующую ошибку компиляции: Cannot subscript a value of type '[String : String]' with an index of type '(key: MovieKey)'

Если я не ошибаюсь, dic — это Dictionary с ключом String, а MovieKey — это RawRepresentable, а необработанное значение равно String...

Если кто-то может объяснить, что я делаю неправильно, заранее спасибо.


person Zaphod    schedule 12.02.2019    source источник
comment
Я просто быстрый n00b, но разве это не должно быть dic[MovieKey.movieId] = "abc123"?   -  person trojanfoe    schedule 12.02.2019


Ответы (1)


Проблема в том, что вы неправильно используете индекс. Вы не должны указывать какие-либо метки аргументов для вызова индекса, просто укажите значение enum.

dic[MovieKey.movieId] = "abc123" прекрасно компилируется.

person Dávid Pásztor    schedule 12.02.2019