Swift 3 - перебрать универсальную коллекцию - PullRequest
0 голосов
/ 28 августа 2018

У меня есть структура 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()
    }
}
...