gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:51:10 24 4
gpt4 key购买 nike

在使用 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)

遇到问题,因为 number 和 x 应该明显支持加法。

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

最佳答案

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

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 }
}

要使类型符合上述协议(protocol),只需在该类型上定义扩展即可。

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

关于swift - 如何为可添加参数创建通用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34170500/

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