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

Swift结构体赋值后读取变量返回nil问题求助

问题分析与解决方案

嘿,我来帮你拆解下为什么会出现这个问题,以及怎么修复它~

核心问题所在

你的代码里有两个关键问题导致最终打印出nil:

  1. testing变量从未被初始化
    你声明了var testing: MainStruct?,但它的默认值是nil。当你用testing?.array![0].firstName = "TEST"这种可选链调用时,因为testing是nil,整个链式调用会直接短路,赋值操作根本没有执行,所以firstName自然还是nil。

  2. 结构体是值类型,就算初始化后直接修改也有坑
    就算你初始化了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:24:15