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

想知道是否有人可以帮助我使用 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",y_seed:[10.00,12.40,14.80],name:"Handball",y_seed:[12.00,14.87,17.77],name:"Dancing",hasMult:true),name:"Frisbee",name:"Volleyball",name:"Archery",y_seed:[3.50,4.33,5.17],name:"Golf",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()
}

我想要做的是根据’name’字段过滤exercise数组,并填充一个新的数据源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()
}

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

那么,我如何过滤一组结构?

谢谢!

解决方法

如果你不坚持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",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)

它打印水球,排球,高尔夫.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...