2016-09-30 4 views
0

Я построил собственный класс, который содержит «внутренний» массив и предлагает некоторые полезные методы.Как отсортировать типизированный массив в 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 сопоставимым, вы запрещаете несопоставимые элементы только потому, что их нельзя сортировать ed с '<' and'>'? Во всяком случае, вы можете добавить расширение, которое применяется только тогда, когда T сопоставимо, что предлагает функцию сортировки по умолчанию. – overactor

+0

Я знаю, что я просто хотел просто ответить на вопрос и избежать того, что * Binary Operator <не может применяться к ... * сообщению об ошибке. – vadian

+0

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

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