Swift如何为Codable结构体添加无参构造器快速生成空实例
解决方案
方案1:为所有存储属性添加默认值(推荐,实现最简单)
Swift 的结构体默认会为所有存储属性都提供了默认值的类型自动生成无参数构造器,不需要手动编写额外的构造器代码。
修改后的结构体代码如下:
struct ResponseToken: Identifiable, Codable, Hashable { var id: UUID { return UUID() } // 给存储属性添加默认空字符串 let access_token: String = "" enum CodingKeys: String, CodingKey { case access_token } } struct ResponseUserInfo: Identifiable, Codable, Hashable { var id: UUID { return UUID() } // String类型默认值设为空字符串 let login: String = "" let avatar_url: String = "" let html_url: String = "" let created_at: String = "" let updated_at: String = "" // Int类型默认值设为0 let public_repos: Int = 0 let public_gists: Int = 0 let followers: Int = 0 let following: Int = 0 enum CodingKeys: String, CodingKey { case login, avatar_url, html_url, public_repos, public_gists, followers, following, created_at, updated_at } }
修改完成后就可以直接调用无参构造器生成实例:
var token: ResponseToken = ResponseToken() var userInfo: ResponseUserInfo = ResponseUserInfo()
方案2:扩展中手动实现无参构造器(兼容原有成员构造器)
如果你不想修改原有属性的定义,还需要保留原来的逐一传参构造器,可以在扩展中单独添加无参构造器,该操作不会覆盖系统自动生成的成员构造器:
// 给ResponseToken添加无参构造器 extension ResponseToken { init() { self.init(access_token: "") } } // 给ResponseUserInfo添加无参构造器 extension ResponseUserInfo { init() { self.init(login: "", avatar_url: "", html_url: "", created_at: "", updated_at: "", public_repos: 0, public_gists: 0, followers: 0, following: 0) } }
注意事项
- 上述两种方案都不会影响你原有 Codable 编解码、Identifiable 等协议的正常工作,id 是计算属性,不需要参与构造过程。
- 方案2的优势是你仍然可以使用原有构造器按需传入属性值,适用场景更灵活。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

