Используя 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
...
Если кто-то может объяснить, что я делаю неправильно, заранее спасибо.
dic[MovieKey.movieId] = "abc123"
? - person trojanfoe   schedule 12.02.2019