将Double二维数组转为String二维数组时遇索引越界错误,如何修复?
问题修复:Double二维数组转String二维数组的索引越界错误
错误原因
你的代码崩溃是因为初始化的result数组结构与原数组不匹配,直接通过索引赋值不存在的元素导致索引越界:
- 初始
result = [[]]只包含一个空的子数组,当原数组的子数组数量大于1时,访问result[i](i≥1)会直接越界; - 即使处理第一个子数组(i=0),
result[0]是空数组,访问result[0][j](j≥0)也会因为空数组没有对应索引的元素而崩溃; - Swift数组不允许直接通过索引赋值未初始化的位置,必须先确保对应位置有元素,或者通过
append方式添加元素。
修复方案
方案1:手动遍历构建数组(基础写法)
通过遍历原数组的每个子数组,逐个转换元素并构建新的子数组,再添加到结果数组中:
var arrayOfDouble: [[Double]] = [[1.1, 2.2], [3.3, 4.4]] func change(_ doubles: [[Double]]) -> [[String]]{ var result: [[String]] = [] // 遍历原数组的每个子数组 for subDoubles in doubles { var stringSubArray: [String] = [] // 遍历子数组中的每个Double元素,转换为String for num in subDoubles { stringSubArray.append(String(num)) } // 将转换后的子数组添加到结果数组 result.append(stringSubArray) } return result } var lll:[[String]] = change(arrayOfDouble) print(lll) // 输出:[["1.1", "2.2"], ["3.3", "4.4"]]
方案2:使用高阶函数map简化代码(Swift风格写法)
利用Swift的map高阶函数可以更简洁地完成转换,无需手动管理数组的初始化和索引:
var arrayOfDouble: [[Double]] = [[1.1, 2.2], [3.3, 4.4]] func change(_ doubles: [[Double]]) -> [[String]]{ // 外层map处理每个子数组,内层map处理子数组中的每个元素 return doubles.map { subArray in subArray.map { String($0) } } } // 进一步简化的单行版本: // func change(_ doubles: [[Double]]) -> [[String]] { doubles.map { $0.map(String.init) } } var lll:[[String]] = change(arrayOfDouble) print(lll)
内容的提问来源于stack exchange,提问作者Rizky Pratama
相关产品推荐
相关产品推荐

