Swift是否支持类似JS的解构赋值,从解码JSON对象直接提取同名变量?
Swift实现类似JS对象解构的方案
Swift原生没有内置和JavaScript完全对齐的对象解构语法,但可以通过元组解构的方式实现你需要的「将解码后实例的属性直接赋值给同名变量、无需逐个重复写取值逻辑」的需求。
方案1:直接用元组解构(最简便,无额外代码)
你注释中写的let (name, surname, car) = ...的写法调整后即可直接使用,只需要把右侧对应属性按顺序传入元组即可:
// 解码后只需要加这一行即可完成解构 let (name, surname, car) = (secondUser.name, secondUser.surname, secondUser.car) // 后续直接使用同名变量即可 print(secondUser, name, surname, car[0])
如果需要忽略某个属性,用下划线占位即可,和JS解构的忽略逻辑一致:
// 忽略surname属性 let (name, _, car) = (secondUser.name, secondUser.surname, secondUser.car)
方案2:预定义解构属性(适合高频使用场景)
如果某个结构体你经常需要做解构操作,可以给结构体扩展一个解构用的计算属性,后续使用时不需要再重复写属性路径:
extension User { var destruct: (name: String, surname: String, car: [Car], number: Int) { (name, surname, car, number) } } // 使用时直接调用解构属性即可 let (name, surname, car, _) = secondUser.destruct print(name, surname, car[0])
完整可运行代码
import Foundation struct Car: Codable { var name, color, licensePlate: String } struct User: Codable { var name, surname: String var car: [Car] var number: Int = 0 } let DB5 = Car(name: "Aston Martin DB5", color: "gray", licensePlate: "xx001xx") let DB11 = Car(name: "Aston Martin DB11", color: "blue", licensePlate: "xx002xx") // 编码 let user = User(name: "James", surname: "Bond", car: [DB5,DB11]) let jsonEncoder = JSONEncoder() guard let jsonData = try? jsonEncoder.encode(user) else { fatalError("编码失败") } // 解码 let jsonDecoder = JSONDecoder() guard let secondUser = try? jsonDecoder.decode(User.self, from: jsonData) else { fatalError("解码失败") } // 解构赋值 let (name, surname, car) = (secondUser.name, secondUser.surname, secondUser.car) print(secondUser, name, surname, car[0])
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

