gpt4 book ai didi

swift - 具有通用协议(protocol)类型变量的通用协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 01:18:30 25 4
gpt4 key购买 nike

我如何创建一个通用协议(protocol),它具有另一个通用协议(protocol)的类型?

在我的示例中,我有一个堆,它是一个通用类型的协议(protocol),因为我的堆中可以有任何符合 Comparable 协议(protocol)的元素。

所以在我的 priorityQueue 中,我也想将其作为协议(protocol)(为了避免代码重复和练习)我希望我的 priorityQueue 包含一个堆,其中 Heap.T 等于 PriorityQueue.Item,但我不不知道该怎么做。有什么想法吗?

当然我可以用“抽象类”来做到这一点,但这不是这里的重点。

顺便说一句,下面的代码甚至无法编译

代码:

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 }
}

最佳答案

此代码有效:

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 类符合 HeapAnyHeap 由于多态性, 。 (请注意,Item 必须符合 Comparable 才能符合协议(protocol) Heap) 实现这些协议(protocol)非常简单:

class AQueueable: PriorityQueuable, Comparable {
var hashValue: Int { return 1 }
var key: String = "Hi"
var value: String = "YoMaMa"
static func < (lhs: AQueueable, rhs: AQueueable) -> Bool {
// implement code
return false
}
static func == (lhs: AQueueable, rhs: AQueueable) -> Bool {
// implement code
return false
}
}

class AQueue: PriorityQueue {
var heap: AnyHeap = AnyHeap<AQueueable>(data: [AQueueable](), heapify: { parentIndex in
// implement code
})
}

关于swift - 具有通用协议(protocol)类型变量的通用协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45117317/

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