gpt4 book ai didi

基于运算符的 Swift 泛型约束

转载 作者:行者123 更新时间:2023-11-30 10:04:06 24 4
gpt4 key购买 nike

假设我想将数组条目的所有值相加。不仅是整数,还包括 double 值或我自己创建的实现 + 运算符的某种类型。所以我的问题是:是否可以创建这样一个带有约束的函数,该约束基于类型是否实现运算符这一事实?例如或类似的东西(显然这是行不通的)。

提前致谢

最佳答案

有多种方法可以解决该问题。

整数算术类型

虽然我不知道没有明确的方式来表达“嘿 Swift,我只想允许 T 具有此运算符的类型”,但我们通常认为能够进行加、减、乘和除的所有类型都会自动符合到 IntegerArithmeticType,它可以用作任何泛型函数或类型的泛型约束。

例如:

func addAll<T: IntegerArithmeticType>(array: [T]) -> T {
var count = array[0]
for (index, value) in array.enumerate() {
if index != 0 {
count += value
}
}
return count
}

请注意,在此快速模型版本中,我使用数组的第一个值初始化了 count,然后通过在 for 循环内检查索引是否为 0 来避免重复计数。我无法用 0 初始化 count,因为 0 是 Int,而我希望 countT 类型.

您提到让您自己的类型也可以使用它。一种选择是让您的自定义类型符合 IntegerArithmeticType,尽管它需要的不仅仅是 + 运算符。有关 IntegerArithmeticType 的详细信息,请参阅 SwiftDoc .

自定义协议(protocol)

如果遵守 IntegerArithmeticType 对您施加了某种限制,您可以使用 + 函数以及您想要的任何其他要求创建自定义协议(protocol)。毕竟,运算符实际上只是函数。请注意,您可以通过扩展来添加与现有类型的一致性。例如:

protocol Addable {
func +(left: Self, right: Self) -> Self
// Other requirements...
}

extension Int: Addable {}
extension Double: Addable {}

关于基于运算符的 Swift 泛型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003195/

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