Как отсортировать типизированный массив в swift?

#arrays #swift #sorting

#массивы #swift #сортировка

Вопрос:

Я создал пользовательский класс, который содержит «внутренний» массив и предлагает несколько полезных методов.

 class ArrayList<T> {
  private var array : Array<T>

  public init() {
    array = Array<T>()
  }

  public func add(element : T) {
    array.append(element)
  }

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

  ...
}
  

Хорошо, пока это работает нормально для меня.
Но теперь я также хочу иметь метод сортировки массива. У меня уже есть следующее:

 public func sort(comparator : ?) {
  array = array.sort(comparator)
}
  

Знак вопроса обозначает тип параметра, и в этом моя проблема: какой тип должен иметь параметр? Я кое-что читал о @noescape<,> но я не могу заставить его работать!
Я использую Swift 2.2.

Ответ №1:

Самый простой способ — использовать стандартное закрытие

 public func sort(comparator : (T, T) -> Bool) {
   array.sortInPlace(comparator)
}
  

и ограничить общий тип Comparable протоколом

 class ArrayList<T : Comparable>
  

Затем вы можете использовать этот код

 let arrayList = ArrayList<Int>()
arrayList.add(5)
arrayList.add(12)
arrayList.add(10)
arrayList.add(2)

arrayList.sort { $0 < $1 }

print(arrayList.array) // [2, 5, 10, 12]
  

Комментарии:

1. Почему вы ограничиваете T сопоставимыми, вы запрещаете сопоставимые элементы только потому, что они не могут быть отсортированы с < помощью and > ? Во всяком случае, вы могли бы добавить расширение, которое применяется только тогда, когда T сопоставимо, которое предлагает функцию сортировки по умолчанию.

2. Я знаю, что просто хотел ответить на вопрос довольно просто и избежать двоичного оператора < невозможно применить к … сообщение об ошибке.

3. это будет работать нормально без ограничений, а также до тех пор, пока T сопоставимо. И если это не так, вы не должны ожидать, что сможете сравнить его с помощью < , и вы все равно можете сравнить его каким-то другим способом.