Swift中向模型数组追加元素时数组count显示nil如何解决
Swift数组追加后count返回nil问题排查
问题原因
- 可选链调用静默失败:你使用的
newsellData?.data.productDetails?.varients.append(contentsOf: variants)属于可选链式调用,只要newsellData、data、productDetails、varients任意一个可选值为nil,整行代码会直接终止执行,不会抛出任何报错,数组没有被写入内容,后续访问count自然返回nil - 模型数组属性无默认值:如果你的
varients属性在模型定义时没有设置默认空数组,初始化模型后该属性默认是nil而非空数组,即使上层属性都不为空,访问count也会返回nil - 属性为只读类型:如果
varients或者上层属性被定义为let只读类型,追加操作会被禁止,可选链同样会静默不执行,你感知不到操作失败
解决方法
方法1:给模型数组属性设置默认空数组
在定义模型时直接给数组属性赋值默认空数组,从根源避免属性为nil:
// 对应模型定义示例 struct ProductDetails: Codable { // 其余属性省略 var varients: [YourVarientType] = [] // 非可选类型默认是空数组,永远不会为nil // 如果业务需要必须定义为可选,可写作 var varients: [YourVarientType]? = [] }
方法2:追加前做可选绑定,避免静默失败
替换原来的可选链调用,用可选绑定解包所有层级,解包失败时可加兜底逻辑:
// 解包判断所有层级是否存在 if var varients = newsellData?.data.productDetails?.varients { varients.append(contentsOf: variants) // 注意:如果你的模型是struct值类型,修改后需要重新赋值回去 newsellData?.data.productDetails?.varients = varients } else { // 解包失败时走兜底初始化逻辑 if newsellData?.data == nil { newsellData?.data = NewSellLocalDataModel.DataType() // 替换为你的data对应类型初始化方法 } if newsellData?.data.productDetails == nil { newsellData?.data.productDetails = ProductDetails() // 替换为你的productDetails对应类型初始化方法 } newsellData?.data.productDetails?.varients = variants }
方法3:检查属性读写权限
确认varients、productDetails、data属性都被定义为var可写类型,不要用let修饰可变属性。
内容的提问来源于stack exchange,提问作者Dipesh
相关产品推荐
相关产品推荐

