【发布时间】:2020-08-30 05:33:23
【问题描述】:
我有一个基于 Comparable 的通用二叉搜索树:
public class BSTree<T: Comparable> {
public func insert(_ val: T, _ n: Int) {
// ...
}
@discardableResult
public func delete(_ val: T, _ n: Int) -> Int {
// ...
}
}
如果 T 是算术类型,我想添加提供值总和的功能。我尝试了以下方法:
public class BSTree<T: Comparable> {
private var sumStorage: T?
public func insert(_ val: T, _ n: Int) {
if let arithVal = val as? AdditiveArithmetic {
for _ in 0 ..< n { sumStorage += arithVal }
}
// ...
}
@discardableResult
public func delete(_ val: T, _ n: Int) -> Int {
// ...
numDeleted = ...
if let arithVal = val as? AdditiveArithmetic {
for _ in 0 ..< numDeleted { sumStorage -= arithVal }
}
}
}
extension BSTree where T: AdditiveArithmetic {
public var sum: T {
sumStorage as? T ?? T.zero
}
}
当然,当我尝试将val 转换为AdditiveArithmetic 时,我得到“协议'AdditiveArithmetic' 只能用作通用约束,因为它具有Self 或关联的类型要求”。加上sumStorage 不是AdditiveArithmetic,所以我不能添加它,我不能让它成为扩展的存储属性,因为......你不能。
我最后想到的是使用继承:
class SummedBSTree<T>: BSTree<T> where T: AdditiveArithmetic & Comparable {
public var sum = T.zero
override public func insert(_ val: T, _ n: Int) {
super.insert(val, n)
for _ in 0 ..< n { sum += val }
}
@discardableResult
override public func delete(_ val: T, _ n: Int) -> Int {
let numDeleted = super.delete(val, n)
for _ in 0 ..< numDeleted { sum -= val }
return numDeleted
}
}
这行得通,但它似乎是使用大锤的情况,珠宝商的螺丝刀应该能够做到这一点。令人沮丧的是,在 Objective-C(和其他强类型语言)中很容易做到的事情在 Swift 中却如此困难。有人可以想出一种无需子类化即可添加求和功能的方法吗?
【问题讨论】:
-
向 BSTree 添加关联类型是否有效?
标签: swift generics inheritance swift-extensions