gpt4 book ai didi

arrays - 初始化器避免将空数组作为参数

转载 作者:搜寻专家 更新时间:2023-11-01 06:44:14 25 4
gpt4 key购买 nike

我有一个初始化器它需要一个值

internal init(value pValue: T) { ... }

现在我有一个便利的初始化程序,可以将数组转换为我的类型。但该数组可能不为空(因为它需要一个值才有意义,因此前面有指定的初始化程序)。

internal convenience init(array pArray: [T]) {
guard !pArray.isEmpty else {
// it is not correct to init without at least one value
return // or assert
} // compiler error because there is no init call

.. // init with non-empty array
}

有什么解决方案可以让使用该界面的人不会感到惊讶并且仍然具有良好的可用性?

这里的障碍是,在初始化器中,每条路径都需要调用初始化器。

我认为有意义的解决方案是,当初始化器获取空数组作为参数时,创建具有该类型 T 的任意值的类型。

self.init(T())

但是我不能创建T,因为我不知道T的初始化器。

我不能简单地使用

self.init(0)

因为编译器需要类型为 T 的初始化程序。


我确实将它实现为静态方法并且它有效(因为我可以选择不使用 init),但我希望它作为非静态方法

我也确实将它实现为可变参数并且它可以工作,但是这对于许多参数来说非常不方便

最佳答案

一个失败的初始化是答案,但你需要声明 <T> , 你需要调用主init -

class A { // or class A<T> 
var count = 0

init() {
}

internal convenience init?<T>(array pArray: [T]) { // <T> not needed if declared at Class level
guard !pArray.isEmpty else {
// it is not correct to init without at least one value
return nil
}

// init with non-empty array
self.init()
self.count = pArray.count
}
}

let n:[String] = ["a"]
if let a = A(array: n) {
print("\(a.count)")
} else {
print("nil")
}

关于arrays - 初始化器避免将空数组作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com