#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 сопоставимо. И если это не так, вы не должны ожидать, что сможете сравнить его с помощью
<
, и вы все равно можете сравнить его каким-то другим способом.