【问题标题】:Filter a struct array according to a NSPredicate SWIFT根据 NSPredicate SWIFT 过滤结构数组
【发布时间】:2017-10-19 17:06:44
【问题描述】:

我有一个UITableView 和一个UISearchController。我想根据UISearchBar.textNSPredicate 过滤我的数据数组(名为:allGames)。

我的代码只过滤这样的字符串数组:

func updateSearchResults(for searchController: UISearchController) {

    filteredGames.removeAll(keepingCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (allGames).filtered(using: searchPredicate)

    filteredGames = array as! [String]

    self.tableView.reloadData()
}

在这里我可以过滤我的数组。但是如果我创建这个结构:

struct Games {

    var name: String?
    var type: String?
    var image: UIImage?
}

如何根据游戏名称和类型过滤数组?提前感谢您的帮助。

【问题讨论】:

标签: arrays swift struct filter uisearchcontroller


【解决方案1】:

假设allGames 是一个数组[Games]——顺便说一下,该结构应该以单数形式命名Game——我强烈建议使用本机Swift filter 函数

let searchText = searchController.searchBar.text!
let fileredGames = allGames.filter { $0.name?.range(of: searchText, options: [.caseInsensitive]) != nil 
                                  || $0.type?.range(of: searchText, options: [.caseInsensitive]) != nil }

还要考虑将结构中的typename 声明为非可选。

【讨论】:

  • 看起来效果不错。我将我的数组命名为 allGames 以使 filterGames 有所不同。你的意思是在我的结构中创建启动变量更好?喜欢let name: String = ""
  • 不,有一个普遍的误解。许多人的意思是(并在教程中建议)没有初始化程序就不能声明属性为非可选(没有感叹号或问号)。在类的情况下这是正确的,但在结构中 你可以 因为存在隐式的成员初始化程序。如果该值不应更改,您甚至可以将属性声明为常量 let name: String
  • 完美运行。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多