使用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应该明显支持添加。
我应该如何更改我的代码?我想我需要在类型上添加约束。我不太清楚如何。
答案 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