You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:25:25