【发布时间】:2015-01-28 10:56:29
【问题描述】:
作为练习,我尝试在 Swift 中扩展 Array 以添加 sum() 成员函数。这应该是类型安全的,我希望只有在数组包含可以相加的元素时才能调用sum() 进行编译。
我尝试了一些类似这样的变体:
extension Array {
func sum<U : _IntegerArithmeticType where U == T>() -> Int {
var acc = 0
for elem in self {
acc += elem as Int
}
return acc
}
}
这个想法是说,“好吧,这是一个泛型函数,泛型类型必须类似于Int,并且还必须与数组元素的类型T相同” .但是编译器抱怨:“相同类型的要求使泛型参数 U 和 T 等效”。没错,它们应该是,加上额外的约束T : _IntegerArithmeticType。
为什么编译器不让我这样做?我该怎么做?
(我知道我应该稍后修复事物的相加方式以及返回类型究竟是什么,但我现在卡在类型约束上。)
【问题讨论】:
-
(目前)无法使用要求元素为受限类型的方法来扩展 Array。比较stackoverflow.com/questions/24938948/… 或stackoverflow.com/questions/25630476/…(两者都可能被视为重复)。
-
你写了“(当前)”。有没有人听说它可能很快就会改变?
-
我认为,我在 devforums.apple.com 中读到过这是一个已知问题,将来可能会改变,但我不能 100% 确定。如果我再次找到它,我会给你链接。
-
谢谢。我将发布我发现的最不坏的解决方法作为答案。
标签: swift type-constraints generics swift-extensions