Swift中二维整数数组未初始化报错的解决方法及原理咨询
解决你的Swift二维数组初始化问题
嘿,刚学Swift遇到这种数组问题太正常了,我来一步步帮你搞定!
首先,直接给你解决方法
你现在的问题是只声明了数组类型,但没有给它初始化一个实际的数组实例,而且Swift数组不会自动帮你创建不存在的元素。这里有两种最常用的解决方式:
方式1:动态添加子数组(适合不确定总数量的情况)
先把数组初始化为空数组,然后每次需要添加一组卡片时,直接把包含3个整数的子数组追加进去,而不是直接通过下标赋值:
// 先初始化空的二维数组 var allSetsOfCards: [[Int]] = [] // 当你得到i、j、k三个数时,直接追加完整的子数组 let newCardSet = [i, j, k] allSetsOfCards.append(newCardSet) // 或者直接一行搞定 allSetsOfCards.append([i, j, k])
这样就不用管setNumber,数组会自动帮你管理索引,新的子数组会排在最后。
方式2:提前初始化指定大小的数组(适合知道总组数的情况)
如果你提前知道一共会有多少组卡片(比如总共有10组),可以直接初始化一个包含指定数量子数组的二维数组,每个子数组先填默认值(比如[0,0,0]),之后再修改对应位置的值:
// 假设你知道总共有10组卡片,先初始化10个默认的子数组 let totalSets = 10 var allSetsOfCards = Array(repeating: [0, 0, 0], count: totalSets) // 现在就可以通过下标修改了 let setNumber = 2 allSetsOfCards[setNumber][0] = i allSetsOfCards[setNumber][1] = j allSetsOfCards[setNumber][2] = k
再给你简单解释下Swift数组的机制
为什么会出现那个错误?核心原因有两个:
- Swift数组必须先初始化才能用:你只写了
var allSetsOfCards: [[Int]],这只是告诉编译器“这个变量是二维整数数组类型”,但它还没有分配内存,没有实际的数组对象。就像你说“我要一个盒子”,但还没真的拿到盒子,自然不能往里面放东西。必须给它一个初始值,比如[](空数组)或者上面的Array(repeating:...)。 - Swift数组不会自动创建不存在的元素:和有些语言不同,Swift不会因为你访问
arr[index]就自动帮你在这个位置创建元素。比如你有一个空的二维数组,allSetsOfCards[setNumber]这个位置根本没有子数组,所以你没法去修改它的第0、1、2位。必须先把这个子数组放到外层数组里(不管是append还是初始化时就放),才能访问它的下标。
另外补充一点:Swift的数组是值类型,意思是每次你把数组赋值给另一个变量,或者传递给函数时,逻辑上会复制一份完整的数组(Swift有底层优化,不会随便做无意义的复制),这和Objective-C里的NSArray(引用类型)不太一样,刚入门先记住前面两点核心规则就够啦。
内容的提问来源于stack exchange,提问作者ProfessorHelloKittyNr1
相关产品推荐
相关产品推荐

