You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:53:56