Swift结构体赋值后读取变量返回nil问题求助
问题分析与解决方案
嘿,我来帮你拆解下为什么会出现这个问题,以及怎么修复它~
核心问题所在
你的代码里有两个关键问题导致最终打印出nil:
testing变量从未被初始化
你声明了var testing: MainStruct?,但它的默认值是nil。当你用testing?.array![0].firstName = "TEST"这种可选链调用时,因为testing是nil,整个链式调用会直接短路,赋值操作根本没有执行,所以firstName自然还是nil。结构体是值类型,就算初始化后直接修改也有坑
就算你初始化了testing,InternalArray是结构体(值类型),数组里存储的是它的副本。直接通过数组下标修改属性的方式,在Swift里是不允许的(编译器会报错),因为你拿到的是一个不可变的副本。
修复后的代码示例
struct MainStruct : Decodable{ var array : [InternalArray]? } struct InternalArray : Decodable{ var firstName : String? var lastName : String? var number : Int? // 这里建议变量名小写开头,符合Swift命名规范 } // 1. 先初始化testing实例,并且给array赋值一个包含元素的数组 var testing = MainStruct(array: [InternalArray()]) // 2. 修改数组里的元素:先取出副本,修改后放回数组 if var firstItem = testing.array?[0] { firstItem.firstName = "TEST" testing.array?[0] = firstItem } // 安全地打印值,避免强制解包崩溃 print("test value \(testing.array?[0].firstName ?? "nil")")
额外的优化建议
- 尽量避免使用
!强制解包,一旦可选值为nil会直接导致崩溃,用?可选链或者??默认值来处理更安全。 - 遵循Swift的命名规范:变量名、属性名用小驼峰(比如把
Number改成number),类型名用大驼峰。
内容的提问来源于stack exchange,提问作者Mike T
相关产品推荐
相关产品推荐

