Если вы можете использовать структуру, тогда ответ @ vadian сработает.
Если вам по какой-то причине нужна ссылочная семантика, вы можете обернуть свой класс данных адаптером, который соответствует интерфейсу вашего абонента.
В зависимости от того, как вы хотите обрабатывать ошибки (возвращать необязательный или throw), вы будете реализовывать различные методы init (data :).
Если ваш вызывающий может поймать ошибку, вы можете сделать что-то вроде this:
class AdapterType {
let someType: SomeType
init(data: Data) throws {
self.someType = try JSONDecoder().decode(SomeType.self, from: data)
// ... add do/catch/throw if you need to remap the error for your caller
}
}
let jsonData = """
{"name":"Foo",\"id":12}
""".data(using: .utf8)!
let result = try? AdapterType(data: jsonData)
print("\(result?.someType.name ?? "(unset)")")
Если вызывающему абоненту все равно, почему вызов не удался, и он может обработать возвращаемый необязательный параметр, вы можете использовать неисправный инициализатор, например:
class AdapterType {
let someType: SomeType
init?(data: Data) {
guard let someType = try? JSONDecoder().decode(SomeType.self, from: data)
else { return nil }
self.someType = someType
}
}
let jsonData = """
{"name":"Foo",\"id":12}
""".data(using: .utf8)!
let result = try? AdapterType(data: jsonData)
print("\(result?.someType.name ?? "(unset)")")