【问题标题】:Swift: Filtering an array of structures using UISearchController/PredicatesSwift:使用 UISearchController/Predicates 过滤结构数组
【发布时间】:2015-09-25 10:18:53
【问题描述】:

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

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

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

现在,在我的 tableview 控制器中,我持有一个结构数组,其中包含表的所有数据。

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 以填充表格视图。我不确定在这种情况下如何使用谓词。

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

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

    self.tableView.reloadData()
}

我知道我可以读取字符串数组中的所有名称并将其轻松地显示在 tableview 中。问题是我需要保留结构,因为其中包含的数据传递到其他视图控制器。

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

谢谢!

【问题讨论】:

    标签: ios arrays swift uitableview struct


    【解决方案1】:

    如果您不坚持使用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)
    

    它打印水球、排球、高尔夫

    【讨论】:

    • 这是一个好的开始。但是它只返回名称的字符串数组。理想情况下,我将能够按名称过滤结构数组并返回过滤结果的结构数组。那可能吗?如果不是,我可能可以完成这项工作。谢谢!
    • 它在那里,检查filteredEcercises 数组,它是[Exercise] 数组:) filteredEcercisesNames 只是为了演示它的工作原理。
    • 哦,呃……我不知道我是怎么错过的。好吧,谢谢,这很好用!干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多