我有初始值设定项,需要一个值。
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),但我希望它作为非静态方法
我也把它作为一个变量参数来实现它可行,但是这对于许多参数来说非常不方便
答案 0 :(得分:2)
可以使用可用的初始化答案,但您需要声明<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")
}
答案 1 :(得分:1)
如果数组为空,也许你可以使用失败的初始化器返回source/bin
:
nil