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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:18:02