Как я могу расширить Decodable для инициализации из словаря? - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу расширить Decodable, чтобы я мог создать новый экземпляр класса Codable из словаря значений.

extension Decodable {
    init(from dictionary: [String : Codable]) throws {
        let data = try JSONSerialization.data(withJSONObject: dictionary, options: [])
        let newSelf = try JSONDecoder().decode(self.type, from: data)

        self = newSelf
    }
}

Я получаю ошибку Value of type 'Self' has no member 'type' в строке, начинающейся с let newSelf = ...

Как мне указать тип для использования здесь?

1 Ответ

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

self.type должен быть конкретным типом, а не протоколом.И вы все равно не можете создать экземпляр Decodable.

Что вы можете сделать, это создать общий метод decode, который принимает словарь в качестве параметра, например

func decode<T : Decodable>(from dictionary: [String : Decodable]) throws -> T {
    let data = try JSONSerialization.data(withJSONObject: dictionary)
    return try JSONDecoder().decode(T.self, from: data)
}


struct Person : Decodable {
    let name : String
    let age : Int
}

let dict : [String:Decodable] = ["name" : "Foo", "age" : 30]

let person : Person = try! decode(from: dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...