UISearchController在Struct中搜索struct数组

时间:2017-12-21 05:23:11

标签: ios swift uisearchbar uisearchcontroller

我有两个结构,在课程列表中。

struct Course : Decodable {
let CourseName : String;
let EntryRequirements : String;
}

struct  WebsiteDescription : Decodable {
let FullProgramName :String
let ProgramName : String;
let Courses : [Course]
}

这些结构加载了JSON

我已经实现了一个UISearchController来实际搜索课程名称。

我不知道如何从包含课程名称的WebsiteDescription中引用结构课程。

我曾经用于包含WebsiteDescription的数组

  var allCourses = [WebsiteDescription]()
  var filteredCourses = [WebsiteDescription]()

我试图用这种方法过滤它

func updateSearchResults(for searchController: UISearchController) {
    if searchController.searchBar.text! == "" {
        filteredCourses = allCourses
        acTableView.reloadData()
    } else {
        filteredCourses = allCourses.filter { $0.ProgramName.lowercased().contains(searchController.searchBar.text!.lowercased()) }



    }  
    self.acTableView.reloadData();
}

它会过滤一般程序名称,但我实际上想要使用struct Course中的CourseName进行过滤。

提前谢谢。

This is what I currently get

当我搜索辅导时,只有“指导”才会出现,整个ShortCourses部分出现。

指导是课程名称

1 个答案:

答案 0 :(得分:1)

替换此行

allCourses.filter { $0.ProgramName.lowercased().contains(searchController.searchBar.text!.lowercased())

用这个

allCourses.filter {
             !$0.Courses.filter{$0.CourseName.localizedCaseInsensitiveContains(searchController.searchBar.text!)}.isEmpty
        }

它会根据结构CourseName中的Course给出结果。

编辑:它会为您Array提供Course

allCourses.flatMap{$0.Courses.filter{$0.CourseName.localizedCaseInsensitiveContains(searchController.searchBar.text!)}}