Быстрый массив сортировки по нескольким свойствам

#arrays #swift #sorting

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

Вопрос:

У меня есть объекты, которые находятся в массиве, который я хотел бы отсортировать

 let person = Person()
person.isHome = true
person.firstname = "Foo"
person.surname = "Bar"
  

и т.д…

Я выбираю всех людей

 guard let allPeople = controller.fetchedObjects as? Array<Person> else { return }
  

Теперь я хотел бы отфильтровать и отсортировать

 var homeArray = allPeople
        .filter { $0.isHome == true }
        .sort { $0.surname < $1.surname }
  

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

 var homeArray = allPeople
        .filter { $0.isHome == true }
        .sort { $0.surname < $1.surname }
        .sort { $0.firstname < $1.firstname }
        .sort { $0.isOut == true amp;amp; $1.isOut == false }
  

Я все еще хочу, чтобы они были упорядочены по фамилии, но я также хочу, чтобы они сортировались по имени после фамилии и были ранены выше, чем не пострадавшие… Каков синтаксис? Кажется, я нигде не могу его найти… Должен ли я вернуться к использованию NSArray?

Это так просто, как

 .sort { ($0.isOut == true amp;amp; $1.isOut == false) amp;amp; ($0.firstname < $1.firstname) amp;amp; ($0.surname < $1.surname)}
  

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

1. Изменение fetchRequest NSFetchedResultsController которых намного эффективнее, чем manual фильтрация / сортировка

2. Что, если я не могу изменить FRC? Я знаю, что это не имеет большого смысла, но ребята, с которыми я работаю, создают фреймворк, в котором я должен работать… Итак, я получаю allPeople, а затем я должен фильтровать и сортировать после выборки… Дело не в том, что нет лучшего способа сделать это … более того, мне нужен синтаксис для сортировки таким образом, но с несколькими свойствами

Ответ №1:

 let new = [person,person1,person2,person3,person4]

var homeInArray = new
.filter { $0.isHome == true amp;amp;  $0.isInjured == true }
var homeNINArray = new
.filter { $0.isHome == true amp;amp;  $0.isInjured == false }


 var newHomeArray =    homeInArray.sort { $0.firstName < $1.firstName }   homeNINArray.sort { $0.firstName < $1.firstName }
  

Попробуйте это решение…

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

1. Извините, если я что-то перепутал с синтаксисом bool (что может быть неправильно) Я хочу сортировать не только по bools, но и по нескольким условиям.. Я также добавил имя

2. Это справедливый ответ на точную проблему, которую я представил, хотя so 1 .. но это не совсем то, что мне нужно знать