Есть ли способ передать сопоставитель ключей в Swift/SwiftUI в другую функцию?

#swift #swiftui

Вопрос:

Я сортирую данные с помощью новой замечательной таблицы в SwiftUI 3.0. Однако мне нужно сделать гораздо больше фильтрации данных, прежде чем возвращать их.

Вот что у меня есть (конкретный вопрос находится в .Закрытие обмена)

 @State private var sorting = [KeyPathComparator(Variant.id)]  ...other stuff   Table(displayvariants, selection: $selection, sortOrder: $sorting) {  TableColumn("Variant ID", value: .id) {  Text("($0.id)")  }  TableColumn("Chromosome", value: .id) {  Text("($0.chromosome)")  }  TableColumn("Read Depth", value: .read_depth) {  Text("($0.read_depth)")  }  TableColumn("Ref Allele", value: .reference_allele!)  TableColumn("Var Allele", value: .variant_allele!)  }  .onChange(of: sorting) {  displayvariants.sort(using: $0)  }  

Вот что я хотел бы иметь (см. Изменение в закрытии .onChange)

 @State private var sorting = [KeyPathComparator(Variant.id)]  ..... important stuff   Table(displayvariants, selection: $selection, sortOrder: $sorting) {  TableColumn("Variant ID", value: .id) {  Text("($0.id)")  }  TableColumn("Chromosome", value: .id) {  Text("($0.chromosome)")  }  TableColumn("Read Depth", value: .read_depth) {  Text("($0.read_depth)")  }  TableColumn("Ref Allele", value: .reference_allele!)  TableColumn("Var Allele", value: .variant_allele!)  }  .onChange(of: sorting) {  displayvariants = complexSortAndFilterFunction(KeyPathComparator: sortDescription)  }  

Возможно ли это вообще? Если мне понадобится изменить свой подход, я был бы рад услышать об этом.

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

1. Ты просто имеешь в виду вот так? func complexSortAndFilterFunction(comparator: KeyPathComparatorlt;Variantgt;) ?

2. Спасибо! Когда я нахожусь в функции, мне нужно сделать несколько запросов основных данных. Есть ли способ использовать описание сортировки в качестве NSSortDescriptor?

3. Я не уверен, что это за описание. Вы никогда не определяете его в коде, который вы включили.

4. Верно. Сущность является «Вариантом», и я хочу отсортировать свойство «ref_id» в порядке возрастания. Для основных данных это будет NSSortDescriptor(ключ: «ref_id», по возрастанию: true). Как я могу преобразовать информацию, содержащуюся в описании сортировки, в этот тип запроса?

Ответ №1:

вы могли бы сделать что-то простое, как это:

 Table(displayvariants, selection: $selection , sortOrder: $sorting) {  TableColumn("Variant ID", value: .id) {  Text("($0.id)")  }  TableColumn("Chromosome", value: .id) {  Text("($0.chromosome)")  }  TableColumn("Read Depth", value: .read_depth) {  Text("($0.read_depth)")  }  TableColumn("Ref Allele", value: .reference_allele!)  TableColumn("Var Allele", value: .variant_allele!) } .onChange(of: sorting) { sortDescription in // lt;--- here  displayvariants = complexSortAndFilterFunction(KeyPathComparator: sortDescription) }    func complexSortAndFilterFunction(KeyPathComparator: [KeyPathComparatorlt;Variantgt;]) -gt; [Variant] {  // ... do a lot more filtering on the data before returning it  return [Variant] // lt;-- return the results }