想知道是否有人可以帮助我使用
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)
它打印水球,排球,高尔夫.