Swift中如何从结构体解构多个属性并合并声明为一行?
如何在Swift中一行解构结构体的多个属性
你尝试的let {make, model , year} = carDetail写法不符合Swift语法,正确的做法是利用元组解构来实现一行声明多个let变量,以下是两种可行方案:
方案1:直接通过元组打包解构
这是最直接的写法,把需要的结构体属性打包成元组,再一次性解构为多个变量:
struct Car { let make: String let model: String let year: Int } struct PersonCar { let auto: Car let isUsed: Bool } let car = PersonCar(auto: Car(make: "Subaru", model: "Outback", year: 2017), isUsed: false) let isUsed = car.isUsed let carDetail = car.auto // 正确的一行解构写法 let (make, model, year) = (carDetail.make, carDetail.model, carDetail.year) print(car) print(make) print(model) print(year)
方案2:为结构体添加自定义解构方法(复用性更强)
如果需要多次解构Car结构体,可以给它扩展一个解构方法,让代码更简洁:
struct Car { let make: String let model: String let year: Int } // 添加解构扩展 extension Car { func decompose() -> (make: String, model: String, year: Int) { (make, model, year) } } struct PersonCar { let auto: Car let isUsed: Bool } let car = PersonCar(auto: Car(make: "Subaru", model: "Outback", year: 2017), isUsed: false) let isUsed = car.isUsed let carDetail = car.auto // 调用解构方法一行声明变量 let (make, model, year) = carDetail.decompose() print(car) print(make) print(model) print(year)
额外优化:直接解构嵌套属性
甚至可以跳过carDetail的赋值,直接从PersonCar实例中解构所有需要的属性:
let (isUsed, make, model, year) = (car.isUsed, car.auto.make, car.auto.model, car.auto.year)
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

