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

Swift基于类构造器创建自定义数组:如何在Shop类init中按cnt生成Customer数组

Shop类中Customer数组的初始化实现

核心注意点

因为Customer是引用类型的类,不能直接用Array(repeating:count:)的无闭包形式批量生成元素——这种写法会让数组里所有元素指向同一个内存实例,修改任意一个元素的属性,其他所有元素的属性都会同步变化,属于隐蔽的开发bug。

推荐实现写法

通过区间遍历映射的方式,每次生成独立的Customer实例,匹配传入的cnt参数指定的数组长度:

class Shop {
    let cus: [Customer]
    init(cnt: Int) {
        // 遍历0到cnt-1的索引,逐个生成独立Customer实例
        cus = (0..<cnt).map { index in
            Customer(
                Id: index,
                Name: "用户\(index)",
                Balance: 500
            )
        }
    }
}

这种写法代码简洁,每个Customer实例的id、name可以根据索引自动生成,balance使用题目设定的默认值即可。

其他等价实现

如果更习惯显式循环的逻辑,也可以先创建临时可变数组,循环追加元素后再赋值给常量属性,效果完全一致:

init(cnt: Int) {
    var tempArray = [Customer]()
    for index in 0..<cnt {
        let customer = Customer(Id: index, Name: "用户\(index)", Balance: 500)
        tempArray.append(customer)
    }
    cus = tempArray
}

额外提示

  • 因为cus是let修饰的常量属性,必须在初始化流程完成前完成赋值,否则会触发编译报错。
  • 如果后续需要对这个数组做增删操作,需要把cus的修饰符从let改成var,不然数组本身的引用不可变更。

内容的提问来源于stack exchange,提问作者Ae Ri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 20:06:04