Ich habe ein Array, das in eine TableView geladen wird.
var sections = [
Section(sec: "One",
subSec: ["A", "B", "C", "D", "E"],
expanded: false),
Section(sec: "Two",
subSec: ["A", "B", "C", "D", "E"],
expanded: false),
Section(sec: "Three",
subSec: ["A", "B", "C", "D", "E"],
expanded: false),
Hier ist die Definition für die Abschnitte:
struct Section {
var sec: String!
var subSec: [String]! // [ ] = Array of Strings
var expanded: Bool!
init(sec: String, subSec: [String], expanded: Bool) {
self.sec = sec
self.subSec = subSec
self.expanded = expanded
}
}
Ich versuche eine Suchfunktion aufzubauen. Es funktioniert für ein Standard-Array, aber nicht für meine Variable, da es komplexer ist. Ich habe (mit Hilfe) den Code mit Flatmap angepasst, weiß aber nicht, wie ich ihn den subSec-Strings zuordnen soll.
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filtered = sections.flatMap{ return $0.subSec.lowercased().contains(searchText.lowercased()) ? $0.subSec : nil }
tableView.reloadData()
}
Der Fehler, den ich derzeit erhalte, ist: Value type [String] has no value lowercased
Zusatzcode:
var filtered = [Section]()
let searchController = UISearchController(searchResultsController: nil)
baseText.range(
of: searchText, options: .caseInsensitive, range: nil, locale: nil
) != nil
Wenn Sie den gesamten Abschnitt erhalten möchten, müssen Sie nicht verwenden flatMap
, verwenden Sie einfach afilter
var filtered: [Section] = []
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filtered = sections.filter { section in
section.subSec.contains {
$0.range(
of: searchText, options: .caseInsensitive, range: nil, locale: nil
) != nil
}
}
}
Aber wenn Sie in dem Abschnitt nur die Unterabschnitte haben möchten, die den gesuchten Text enthalten, dann
var filtered: [Section] = []
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filtered = sections.map { section in
var section = section
section.subSec = section.subSec.filter {
$0.range(
of: searchText, options: .caseInsensitive, range: nil, locale: nil
) != nil
}
return section
}
}
Aber wenn Sie nur Unterabschnitte wollen, dann
var filtered: [String] = []
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filtered = sections.flatMap { section in
section.subSec.filter {
$0.range(
of: searchText, options: .caseInsensitive, range: nil, locale: nil
) != nil
}
}
}
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen