通用协议,具有通用协议类型的变量

时间:2017-07-15 10:47:59

标签: swift generics interface protocols

如何创建具有另一种通用协议类型的通用协议?

在我的例子中,我有一个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 }   
}

1 个答案:

答案 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)