2015-12-08 3 views
1

Я написал простой класс очереди в 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!!! 

ответ

3

apple docs

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


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

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

Read this:

class MyColl { 

    private var someColl : [String] = [] 

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

And read this:

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

+0

У меня есть другой вопрос. В C++ '' 'operator()' '' также может быть перегружен. Как это можно реализовать в swift? – AntiMoron

+1

@ AnthMoron затем задайте новый вопрос. SO работает лучше всего, когда вопросы касаются одной проблемы. –

+0

Для точности в соответствии с «Быстрый язык программирования» от apple.Inc оператором в swift являются те комбинации, которые начинаются с '' '/ = - +! *% < > & |^~? '' 'и следовать символами выше и символами Unicode. Только «операторы» могут быть перегружены. Для '' '()' '' может быть реализовано затворами. Для '' '' {} '' 'настройка для него не имеет смысла, поскольку она стоит для областей кода и увеличит проблему синтаксического анализа для компилятора, если была поддержана. – AntiMoron

Смежные вопросы