ios - Swift:使用 UISearchController/Predicates 过滤结构数组

标签 ios arrays swift uitableview struct

想知道是否有人可以帮助我在 Swift 中使用谓词进行过滤。

我有一个有点乱的数据源,我用它来填充 UITableView。数据源是一个结构数组。该结构定义如下:

struct Exercises {
    let category: String
    let name : String
    let x_seed: [Double]
    let y_seed: [Double]
    let hasMult: Bool
}

现在在我的 TableView Controller 中,我持有一个结构数组,其中包含表的所有数据。

class MainTableViewController: UITableViewController, UISearchResultsUpdating {


var exercises = [Exercises]()
var filtered_exercises = [Exercises]()
var resultSearchController = UISearchController()

override func viewDidLoad() {
    super.viewDidLoad()

    // MARK: - Table view data source
    self.exercises = [
        Exercises(category:"Sports", name:"Bowling", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
        Exercises(category:"Sports", name:"Water Polo", x_seed:[125,155,185], y_seed:[10.00, 12.40,14.80], hasMult:false),
        Exercises(category:"Sports", name:"Handball", x_seed:[125,155,185], y_seed:[12.00, 14.87, 17.77], hasMult:false),
        Exercises(category:"Sports", name:"Dancing", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:true),
        Exercises(category:"Sports", name:"Frisbee", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
        Exercises(category:"Sports", name:"Volleyball", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
        Exercises(category:"Sports", name:"Archery", x_seed:[125,155,185], y_seed:[3.50, 4.33, 5.17], hasMult:false),
        Exercises(category:"Sports", name:"Golf", x_seed:[125,155,185], y_seed:[3.50, 4.33, 5.17], hasMult:true)]

    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.sizeToFit()

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    self.tableView.reloadData()
}

我想做的是根据“名称”字段过滤 exercises 数组,并填充新的数据源 filtered_exercises 以填充 TableView 。我不确定在这种情况下如何使用谓词。

// Search functionality 
func updateSearchResultsForSearchController(searchController: UISearchController)
{
    filtered_exercises.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    // ??????????????

    self.tableView.reloadData()
}

我知道我可以读取字符串数组中的所有名称并轻松地将其显示在表格 View 中。问题是我需要保留结构,因为那里包含的数据被传递到其他 View Controller 。

那么,如何过滤结构数组?

谢谢!

最佳答案

如果您不坚持使用 NSPredicate(因为您没有使用 NSFetchRequest,所以没有理由这样做,...),这是代码:

struct Exercises {
  let category: String
  let name : String
  let x_seed: [Double]
  let y_seed: [Double]
  let hasMult: Bool
}

let exercises = [
  Exercises(category:"Sports", name:"Bowling", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
  Exercises(category:"Sports", name:"Water Polo", x_seed:[125,155,185], y_seed:[10.00, 12.40,14.80], hasMult:false),
  Exercises(category:"Sports", name:"Handball", x_seed:[125,155,185], y_seed:[12.00, 14.87, 17.77], hasMult:false),
  Exercises(category:"Sports", name:"Dancing", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:true),
  Exercises(category:"Sports", name:"Frisbee", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
  Exercises(category:"Sports", name:"Volleyball", x_seed:[125,155,185], y_seed:[3.00, 3.73, 4.43], hasMult:false),
  Exercises(category:"Sports", name:"Archery", x_seed:[125,155,185], y_seed:[3.50, 4.33, 5.17], hasMult:false),
  Exercises(category:"Sports", name:"Golf", x_seed:[125,155,185], y_seed:[3.50, 4.33, 5.17], hasMult:true)
]

let options = NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.DiacriticInsensitiveSearch

// Filter exercises by name (case and diacritic insensitive)
let filteredExercises = exercises.filter {
  $0.name.rangeOfString("Ol", options: options) != nil
}

let filteredExerciseNames = ", ".join(filteredExercises.map({ $0.name }))
println(filteredExerciseNames)

它打印Water Polo、Volleyball、Golf

关于ios - Swift:使用 UISearchController/Predicates 过滤结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31276848/

相关文章:

java - 虽然没有超过索引,但索引出现错误

javascript - 单击时,循环遍历每个对象键

ruby - 附加具有唯一值的收集数组

json - iOS (Swift) 中使用 JSONSerialization 的 PUT 请求

ios - Twilio Room 无法识别连接的参与者

ios - 如何快速从 HTTP Get 获取状态码?

ios - WCSession 发送消息在实际设备上不起作用,但在模拟器上起作用

ios - 将 .removeStateDidListener 添加到 deinit 会导致应用程序崩溃

swift - 是否可以通过在 iOS 中使用具有质量设置的 jpeg 编码器来记录并保存到文件?

swift - 如何复制 UIImage?