代码之家  ›  专栏  ›  技术社区  ›  Abhishek Thapliyal

运行时使用NSPredicate崩溃的iOS Swift筛选器数组

  •  0
  • Abhishek Thapliyal  · 技术社区  · 8 年前

    我有一个细胞模型

    struct BeerCellModel: Hashable {
    
        var beer: Beer
    
        static func == (lhs: BeerCellModel, rhs: BeerCellModel) -> Bool {
            return lhs.beer.id == rhs.beer.id
        }
    
        var hashValue: Int {
            return self.beer.id
        }
    }
    

    以及

    public struct Beer {
        public var abv: String
        public var ibu: String
        public var id: Int
        public var name: String
        public var style: String
        public var ounces: Int
    }
    

    现在我有一个数组名' 项目=[BeerCellModel] '上面的单元格模型,我用参数筛选数组 style

    let value = ["tuborg", "budwiser", "bira"]
    let query = value.map { "SELF.beer.style CONTAINS[cd] \($0)" }.joined(separator: " || ")
    let predicate = NSPredicate(format: query)
    let results = self.items.filter { predicate.evaluate(with: $0) }
    

    但我会在运行时崩溃

    2018-08-08 00:38:01.787170+0530蜂排[3388:401950]*** 由于未捕获的异常“NSUnknownKeyException”,正在终止应用程序, 原因:'[<\u SwiftValue 0x60400064dce0>valueForUndefinedKey:]:此 类不符合密钥啤酒的密钥值编码

    数组或谓词中有什么错误?

    更新:添加JSON响应 Beer

      {
        "abv": "0.08",
        "ibu": "35",
        "id": 11,
        "name": "Monks Blood",
        "style": "Belgian Dark Ale",
        "ounces": 12
      },
      {
        "abv": "0.07",
        "ibu": "65",
        "id": 10,
        "name": "Brew Free! or Die IPA",
        "style": "American IPA",
        "ounces": 12
      },
      {
        "abv": "0.04",
        "ibu": "17",
        "id": 9,
        "name": "Hell or High Watermelon Wheat",
        "style": "Fruit / Vegetable Beer",
        "ounces": 12
      }
    
    3 回复  |  直到 8 年前
        1
  •  3
  •   Ahmad F    7 年前

    在这一点上,没有必要处理 NSPredicate ,和 filter 方法足以满足您的情况,如:

    let filtered = items.filter { value.contains($0.beer.style) }
    

    这个 filtered 是数组 BeerCellModel 它应该包含 beer.style value 数组元素。

        2
  •  3
  •   Shehata Gamal    8 年前

    你可以试试

    let value = ["tuborg", "budwiser", "bira"]
    let query = value.map { "self CONTAINS[cd] '\($0)'" }.joined(separator: " || ")
    let predicate = NSPredicate(format: query)
    let results = self.items.filter { predicate.evaluate(with: $0.beer.style) }
    
        3
  •  1
  •   Matthew    8 年前

    看起来你在绘制 String s、 不是一串 BeerCellModel 结构。