iOS开发:Swift中如何设置数组大小?实现类似C++的动态对象数组
嘿,我来帮你搞定Swift里创建指定大小的类对象数组的问题~ 你提到不想用append,想要类似C++里new int[num]那样的动态数组,这里有几种符合需求的方案,还得注意Swift里引用类型(类)的特殊点:
在Swift中创建指定大小的动态类对象数组
方法1:先初始化指定大小数组,再逐个替换独立对象
如果你的类有默认初始化器,可以先创建一个填充了默认实例的数组,之后循环替换每个位置的对象。这里要特别注意:Swift的Array(repeating:count:)对于类类型来说,会让所有元素指向同一个实例的引用,所以必须手动替换每个元素才能得到独立的对象:
class MyClass { var value: Int // 带参数的初始化器 init(value: Int) { self.value = value } // 默认初始化器(可选,用于初始化数组) init() { self.value = 0 } } // 假设你需要的数组大小是num let num = 5 // 创建初始大小为num的数组,填充默认MyClass实例 var myArray = Array(repeating: MyClass(), count: num) // 循环为每个位置赋值新的类对象 for i in 0..<num { myArray[i] = MyClass(value: i) }
方法2:直接生成包含独立对象的指定大小数组
这是更符合Swift风格的写法,用map直接遍历范围生成每个独立的类实例,不需要先填充默认值,也不会有引用共享的问题:
let num = 5 // 生成大小为num的数组,每个元素都是全新的MyClass实例 var myArray = (0..<num).map { _ in MyClass() } // 如果需要用参数初始化每个对象 var myArrayWithCustomValues = (0..<num).map { index in MyClass(value: index) }
方法3:提前预留数组容量(适合后续append但想优化性能)
如果你只是担心append的性能问题(比如频繁扩容),可以用reserveCapacity(_:)提前为数组分配足够的内存空间。这种方式不会直接设置数组大小,而是预留内存,后续append时不会频繁重新分配:
var myArray = [MyClass]() let num = 5 // 预留能容纳num个元素的内存 myArray.reserveCapacity(num) // 后续可以安全append,内存已经提前分配好 for i in 0..<num { myArray.append(MyClass(value: i)) }
和C++写法的对比
C++里new int[num]是直接分配一块连续内存,而Swift的数组是更高层的容器。如果要完全对应“先分配大小再逐个赋值”的逻辑,方法1最接近,但一定要记得替换每个元素;方法2则是Swift推荐的更简洁、安全的实现方式。
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

