如何为可添加的参数创建通用函数?

时间:2015-12-09 04:01:59

标签: swift generics type-constraints

使用Swift泛型,我有以下问题:

此函数按预期使用Int:

类型
func + (number: Int, vector: [Int]) -> [Int] {
    var resArray:[Int]=[]
    for x:Int in vector {
        resArray.append(number+x)
    }
    return resArray
}

我想让它适用于任何有意义的类型。 我尝试过以下方法:

func +<T:NSNumber> (number: T.Type, vector: [T.Type]) -> [T.Type] {
    var resArray:[T.Type]=[]
    for x:T.Type in vector {
        resArray.append(number+x)
    }
    return resArray
}

但是这句话:

resArray.append(number+x)

遇到问题,因为数字和x应该明显支持添加。

我应该如何更改我的代码?我想我需要在类型上添加约束。我不太清楚如何。

1 个答案:

答案 0 :(得分:0)

您可以像下面的AdditiveSemigroup这样的协议定义这样的约束。

protocol AdditiveSemigroup {
    typealias Out = Self
    static func + (a: Self, b: Self) -> Out
}

func +<T: AdditiveSemigroup where T.Out == T> (value: T, vector: [T]) -> [T] {
    return vector.map { $0 + value }
}

要使类型符合上述协议,只需在该类型上定义扩展名。

extension String: AdditiveSemigroup {}

"A" + ["A", "B", "C"] // ==> ["AA", "AB", "AC"]

对于NSNumber,还没有内置的+操作符,因此您必须手动定义它。

extension NSNumber: AdditiveSemigroup {
    typealias This = NSNumber
}

func + (a: NSNumber, b: NSNumber) -> NSNumber {
    return NSNumber(double: a.doubleValue + b.doubleValue)
}

现在,您可以将特殊的+运算符应用于NSNumber的值。

NSNumber(double: 3) + [NSNumber(double: 5)] // ==> 8