【问题标题】:How to predicate objects inside array by object.name如何通过 object.name 谓词数组内的对象
【发布时间】:2019-10-04 10:35:37
【问题描述】:

我有带有变量的对象 Dog

名称:字符串, 年龄:诠释

我有 [Dog] 那里有 5 条狗

我想为搜索栏做谓词,其中 dog.name 包含输入值

下面的代码失败,错误说“没有键名”

 let searchPredicate = NSPredicate(format: "SELF Any.name CONTAINS[c] %@", text)
    let array = (data as NSArray).filtered(using: searchPredicate)
    let productSearchResults = array

【问题讨论】:

  • 你真的需要 NSPredicate 吗?该属性可能被标记为@objc 属性。 Swift Native Array 的 filter() 方法而不是 NSArray 呢?
  • yourArray.filter { $0.name.contains("dogname") }
  • $0.name.range(of: "n", options: .caseInsensitive) != nil,因为它是CONTAINS[c],所以不区分大小写。

标签: ios swift predicate


【解决方案1】:

你不需要 NSPredicate,你可以直接在你的数组上使用过滤器

let productSearchResults = array.filter { $0.name.contains(text) }

但如果你真的想使用 NSPredicate,试试:

NSPredicate(format: "ANY name contains[c] %@", text)

【讨论】:

    【解决方案2】:

    尝试使用filter函数

     let filterArray = dogArray.filter { $0.name.lowercased().contains(searchText.lowercased()) }
    

    【讨论】:

      【解决方案3】:

      正如@Larme 在 cmets 中已经提到的,您应该考虑使用 Swifts Array.filter()

      但是,如果您出于某种原因想要或必须使用NSPredicate,您也可以这样做。请注意,谓词用于测试数组中的每个元素。因此,谓词中使用的 keyPaths 必须针对元素给出。

      因此,谓词必须是: let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", text)

      【讨论】:

        猜你喜欢
        • 2019-05-06
        • 2019-03-30
        • 1970-01-01
        • 2011-05-20
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多