Swift中Codable协议结构体初始化Decoder参数传入问题
解决Swift Codable结构体初始化问题
你遇到的问题核心原因是:Swift包中的public结构体,默认合成的无参/成员初始化器是internal权限的,外部App模块无法访问;而Codable协议自动生成的init(from: Decoder)是public的,所以你只能看到这个初始化器。下面分两种场景给出解决方案:
场景1:手动创建FlightDTO实例(非解码)
在Swift包的FlightDTO结构体中,显式添加public权限的无参初始化器(或带参数的初始化器),这样外部App就能直接创建实例:
public struct FlightDTO { public var flightName: String = "" public var PilotName: String = "" public var copilotName: String = "" public var totalCrewMem: Int = 0 // 显式添加public无参初始化器 public init() {} // 可选:添加带参数的初始化器,方便直接传入属性值 public init(flightName: String, pilotName: String, copilotName: String, totalCrewMem: Int) { self.flightName = flightName self.PilotName = pilotName self.copilotName = copilotName self.totalCrewMem = totalCrewMem } } extension FlightDTO: Codable { enum CodingKeys: String, CodingKey { case flightName case PilotName case copilotName case totalCrewMem } }
修改后,在App中就可以这样创建实例:
// 无参初始化,使用默认值 var flightData = FlightDTO() // 带参数初始化,自定义属性值 var customFlight = FlightDTO(flightName: "CA888", pilotName: "Li Ming", copilotName: "Wang Hua", totalCrewMem: 4)
场景2:从JSON/数据解码得到FlightDTO实例
如果你的需求是从JSON字符串、网络数据等解码生成FlightDTO,不需要手动调用FlightDTO(from:),而是通过JSONDecoder(或PropertyListDecoder)来完成解码,它会自动处理Decoder参数:
示例代码:
// 假设你有JSON格式的数据(可以是网络请求返回的Data,或本地JSON字符串转换的Data) let jsonData = """ { "flightName": "UA123", "PilotName": "John Doe", "copilotName": "Jane Smith", "totalCrewMem": 5 } """.data(using: .utf8)! do { let decoder = JSONDecoder() // 调用decode方法,自动触发FlightDTO的init(from:)初始化器 let flightData = try decoder.decode(FlightDTO.self, from: jsonData) print("航班名称:\(flightData.flightName)") } catch { print("解码失败:\(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者vijay singh yadav
相关产品推荐
相关产品推荐

