У меня есть структура Queue<T>
, основанная на LinkedList<T>()
. Я хочу иметь возможность перебирать элементы в очереди и что-то с ними делать.
После некоторого копания я считаю, что должен унаследовать от Sequence
и сделать что-то вроде этого:
extension Sequence {
public func makeIterator() -> CountableRange<T>.Iterator {
return (0..<self).makeIterator()
}
}
и после того, как я смогу иметь функцию в своем классе Очереди что-то вроде:
func iter(q: T) -> T? {
for i in q {
}
}
кроме бросков расширения Use of undeclared type 'T'
и цикла for a Type 'T' does not conform to protocol 'Sequence'
Я довольно новичок в Swift, и я понимаю, что мне нужно делать, я просто не знаю, как это сделать, и большинство объяснений довольно запутанно. Может ли кто-нибудь указать мне правильное направление?
import Foundation
public struct Queue<T> : Sequence{
fileprivate var list = LinkedList<T>()
public var queueCount : Int {
return list.getCount()
}
public var isEmpty: Bool {
return list.isEmpty
}
public mutating func enqueue(_ element: T) {
list.append(value: element)
}
public mutating func dequeue() -> T? {
guard !list.isEmpty, let element = list.first else { return nil }
list.remove(node: element)
return element.value
}
public func peek() -> T? {
return list.first?.value
}
func iter(q: T) -> T? {
for i in q {
}
}
}
extension Queue: CustomStringConvertible {
// 2
public var description: String {
// 3
return list.description
}
}
extension Sequence {
public func makeIterator() -> CountableRange<T>.Iterator {
return (0..<self).makeIterator()
}
}