Как реализовать пользовательский оператор [] в Swift

Я написал простой класс очереди в Swift. Это реализовано массивом. Теперь я хочу, чтобы это выполнялось больше как встроенный массив. Так что мне нужно реализовать []оператор, но не удалось. Кто-нибудь помогите?

public class SimpleQueue<T : Any>
{
    private var frontCur = 0
    private var reuseCur = -1
    private var capacity = 0
    private var impl = [T]()

    public var count : Int
    {
        get
        {
            return impl.count - frontCur
        }
    }

    public func empty() -> Bool
    {
        return self.count == 0
    }

    public func size() -> Int
    {
        return impl.count
    }

    public func append(o : T)
    {
        if(frontCur > reuseCur && reuseCur >= 0)
        {
            impl[reuseCur] = o
            reuseCur++
        }
        else
        {
            impl.append(o)
        }
    }

    public func pop()
    {
        frontCur++
    }

    public func front() -> T
    {
        return impl[frontCur]
    }

    public postfix func [](index:Int) -> T //Error!!!!
    {
        return impl[index + frontCur]
    }
}

var x = SimpleQueue<Int>()
for index in 1...10{
    x.append(index)
}
print(x.count)
for index in 1...3{
    x.pop()
}
print(x.count,x.front(),x[2]) // x[2] Error!!!

1 ответ

Решение

яблочные документы

Подстрочные индексы позволяют запрашивать экземпляры типа, записывая одно или несколько значений в квадратных скобках после имени экземпляра. Их синтаксис похож на синтаксис метода экземпляра и синтаксис вычисляемого свойства. Вы пишете определения индекса с помощью ключевого слова subscript и задаете один или несколько входных параметров и тип возврата так же, как методы экземпляра.


Индекс не является оператором. Просто метод, отмеченный subscript ключевое слово.

subscript (index:Int) -> T {
    return impl[index + frontCur]
}

Прочитай это:

class MyColl {

    private var someColl : [String] = []

    subscript(index: Int) -> String {
        get {
            return someColl[index]
        }
        set(value) {
            someColl[index] = value
        }
    }
}

И прочитайте это:

Swift обладает хорошо разработанным и обширным набором встроенных типов коллекций. Помимо Array, Dictionary и совершенно новых типов Set, стандартная библиотека предоставляет фрагменты, ленивые коллекции, повторяющиеся последовательности и многое другое, все с единообразным интерфейсом и синтаксисом для операций. Группа встроенных протоколов сбора - SequenceType, CollectionType и некоторые другие - действуют как ступени на лестнице. С каждым шагом тип коллекции получает больше функциональности в пределах языка и стандартной библиотеки.

Другие вопросы по тегам