使用Codable从2个不同的JSON文件中实例化单个类,而不使用选项

我正在使用提供2个JSON URL的API。 每个URL都包含一个嵌套容器,该容器具有属于同一个类和对象的不同属性。

JSON URL 1

{ "last_updated": 1535936629, "xyz": 5, "data": { "dataList": [ { "id": "42", "a1": "a1value", "a2": "a2value", }, // ,,, ] } } 

JSON URL 2

 { "last_updated": 1536639996, "xyz": 5, "data": { "dataList": [ { "id": "42", "lat": "12.345", "lon": "67.890", }, // ,,, ] } } 

我想使用这些JSON URL使用嵌套dataList列表中的项创建单个Codable CustomClass对象,因此我创建了一个Feed结构来处理这两个JSON文件。

Feed.swift

 import Foundation Struct Feed: Decodable { var lastUpdated: Int var xyz: Int var data: KeyedDecodingContainer var dataList: [CustomClass] enum CodingKeys: String, CodingKey { case lastUpdated = "last_updated" case xyz case data } enum dataCodingKey: String, CodingKey { case dataList } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.lastUpdated = try decoder.decode(Int.self, forKey: .lastUpdated) self.xyz = try container.decode(Int.self, forKey: .xyz) self.data = try container.nestedContainer(keyedBy: dataCodingKey.self, forKey: .data) self.dataList = try data.decode([CustomClass].self, forKey: .dataList) } } 

CustomClass.swift

 class CustomClass: NSObject, Decodable, MKAnnotation { var id: String? var a1: String? var a2: String? var lat: Double? var lon: Double? var coordinate: CLLocationCoordinate2D? enum CodingKeys: String, CodingKey { case id case a1 case a2 case lat case lon } required init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) self.id = try values.decode(String.self, forKey: .id) self.a1 = try values.decodeIfPresent(String.self, forKey: .a1) self.a2 = try values.decodeIfPresent(String.self, forKey: .a2) self.lat = try values.decodeIfPresent(Double.self, forKey: .lat) self.lon = try values.decodeIfPresent(Double.self, forKey: .lon) self.coordinate = CLLocationCoordinate2D(latitude: self.lat?, longitude: self.lon?) } } 

我收到以下错误

非’@ objc’属性’坐标’不满足’@objc’协议’MKAnnotation’的要求

我认为我遇到的问题是coordinate需要是非可选的。 但是,解码URL1时, latlon变量将始终为nil,因为它们不存在于该JSON文件中。 如何在不设置选项的情况下从这两个JSON URL进行解码,以便我可以设置coordinate变量?

MKAnnotation需要只读变量coordinate因此使用计算属性:

 var coordinate : CLLocationCoordinate2D { return CLLocationCoordinate2D(latitude: lat ?? 0.0, longitude: lon ?? 0.0) } 

另见我对上一个问题的回答 ,建议使用多个结构/类和generics,这是唯一的方法,如果你想避免选项