【问题标题】:Apple Swift: Initialize Array of Generic TypeApple Swift:初始化泛型数组
【发布时间】:2026-01-31 14:35:01
【问题描述】:

我有一个泛型类型 T 的数组(类的成员)。泛型类型只能是数字类型(double、int 等)。我的问题是如何在初始化程序中将此数组初始化为所有相同的数字?

我看过这个:

self.data = Double[](count: 3, repeatedValue: 1.0)

所以我尝试了这个,但它不起作用......

self.data = T[](count: 3, repeatedValue: 1.0)

有人知道怎么做吗?谢谢。

【问题讨论】:

  • Swift 不进行隐式转换;您是否尝试过repeatedValue: T(1),以及对T 的适当类型约束?

标签: arrays generics swift


【解决方案1】:

所以,这就是我刚刚所做的:

protocol Initable {
    init()
}

class Bar:<T: Initable> {
    var     ar: T[]

    init(length: Int) {
        self.ar = T[](count:length, repeatedValue: T())
    }
}

那么您只需要确保您使用的任何T 都实现了Initable 协议,例如:

extension Int:Initable {}

这让我可以这样做:

var foo = Bar<Int>(3)

我还使用了原型设计替代方案:

class Bar:<T> {
    var     ar: T[]

    init(length: Int, proto:T) {
        self.ar = T[](count:length, repeatedValue:proto)
    }
}

不需要协议,但需要提供的初始值:

var foo = Bar<Int>(length: 3, proto: 34)

【讨论】:

  • 谢谢,我使用了您所说的“原型设计替代方案”。它实际上可以满足我的需要。
  • 从我对文档的阅读来看,原型实现的问题是如果T类型是一个类,它将通过引用传递,这意味着你的数组将被填充对单个实例的引用列表。
  • 很高兴知道。谢谢!
【解决方案2】:

这可行,但不会将数据类型限制为仅限数字类型:

self.data = AnyObject[](count: 3, repeatedValue: 1.0)

【讨论】: