Swift Struct数组无法设置索引大于0的元素,报EXC_BAD_INSTRUCTION错误求助
问题原因分析
你遇到的EXC_BAD_INSTRUCTION错误本质是数组越界访问,咱们拆解下代码逻辑就能明白:
- 你先初始化了空数组
testing?.array = [] - 然后只执行了一次
testing?.array!.append(InternalArray()),这时候数组里只有1个元素,有效索引只有0 - 当你尝试访问
testing?.array![1]时,这个位置根本不存在元素,直接触发了运行时崩溃
解决方案
1. 先添加足够元素再访问
如果你需要操作索引1的元素,得先确保数组里有至少2个元素,比如先执行两次append:
var testing: MainStruct? = MainStruct() testing?.array = [] // 先添加两个空的InternalArray实例 testing?.array!.append(InternalArray()) testing?.array!.append(InternalArray()) // 现在访问索引0和1就没问题了 testing?.array![0].firstName = "TEST" testing?.array![1].firstName = "TEST 1"
2. 用更安全的写法避免强制解包
你的代码里用了!强制解包,不仅会在数组越界时崩溃,要是testing或者array为nil也会崩溃。推荐用可选绑定处理,同时利用值类型特性修改数组:
var testing: MainStruct? = MainStruct() // 先确保数组存在,取出可变副本修改 if var array = testing?.array { // 初始化空数组(如果原本是nil的话) if array.isEmpty { array = [InternalArray(), InternalArray()] } array[0].firstName = "TEST" array[1].firstName = "TEST 1" // 把修改后的数组赋值回去 testing?.array = array }
3. 直接初始化带元素的数组
如果一开始就知道需要多少元素,也可以在初始化MainStruct时直接创建包含对应元素的数组:
// 直接初始化包含两个InternalArray实例的数组 var testing = MainStruct(array: [InternalArray(), InternalArray()]) // 直接修改元素 testing.array?[0].firstName = "TEST" testing.array?[1].firstName = "TEST 1"
额外提示
Swift里数组的索引从0开始,访问前一定要确保索引小于数组的count属性(比如array.count > 1时才能安全访问索引1),同时尽量避免使用!强制解包,多用if let/guard let或者可选链?处理可选值,能大幅减少崩溃概率。
内容的提问来源于stack exchange,提问作者Mike T
相关产品推荐
相关产品推荐

