如何创建具有另一种通用协议类型的通用协议?
在我的例子中,我有一个Heap,它是一个泛型类型的协议,因为我可以在我的堆中有任何符合Comparable协议的元素。
所以在我的priorityQueue中,我也希望将其作为一个协议(为了避免代码重复和练习),我希望我的priorityQueue包含一个堆,其中Heap.T等于PriorityQueue.Item,但我不知道我不知道该怎么做。有什么想法吗?
当然我可以用“抽象类”来做,但这不是重点。
BTW下面的代码甚至不编译
代码:
public protocol PriorityQueuable: Hashable {
associatedtype KeyType: Comparable
associatedtype ValueType: Comparable
var key: KeyType { get set }
var value: ValueType { get set }
}
protocol Heap {
associatedtype T: Comparable
var data: [T] { get set }
mutating func heapify(parentIndex: Int)
}
protocol PriorityQueue {
associatedtype Item: PriorityQueuable
//FIXME: doesn't allow me to do that. Why?
var heap: Heap<Item> { get set }
// doesn't compile as well
// var heap: Heap { get set }
}
答案 0 :(得分:2)
此代码有效:
public protocol PriorityQueuable: Hashable {
associatedtype KeyType: Comparable
associatedtype ValueType: Comparable
var key: KeyType { get set }
var value: ValueType { get set }
}
protocol Heap {
associatedtype T: Comparable
var data: [T] { get set }
mutating func heapify(parentIndex: Int)
}
class AnyHeap<U: Comparable>: Heap {
public init(data: [U], heapify: @escaping (_ parentIndex: Int) -> ()) {
self.data = data
self.anyHeapify = heapify
}
var anyHeapify: (_ parentIndex: Int) -> ()
var data: [U]
func heapify(parentIndex: Int) {
self.anyHeapify(parentIndex)
}
}
protocol PriorityQueue {
associatedtype Item: PriorityQueuable, Comparable
var heap: AnyHeap<Item> { get set }
}
请注意,还有一个符合AnyHeap
的{{1}}类。由于多态性,Heap
是AnyHeap
。 (请注意,Heap
必须符合Item
以符合协议Comparable
实施这些协议非常简单:
Heap)