初始化程序避免将空数组作为参数

时间:2015-08-24 07:53:12

标签: arrays swift generics initialization

我有初始值设定项需要一个值

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),但我希望它作为非静态方法

我也把它作为一个变量参数来实现它可行,但是这对于许多参数来说非常不方便

2 个答案:

答案 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