微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐