NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作
Posted
技术标签:
【中文标题】NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作【英文标题】:NSPredicate object model array filter not working its crashing in Swift 4.0 【发布时间】:2018-02-20 08:57:10 【问题描述】:我在 swift 4.0 中工作,我在 MutableArray 中有模型对象, NSPredicate 不起作用。
//Here is code
//Model class:
class Modelclass: NSObject
var firstName:String!
var lastName:String!
// Viewcontroller doing predicate:
let ary = NSMutableArray()
let userModel = Modelclass()
userModel.firstName = "Arrya"
userModel.lastName = "stark"
ary.add(userModel)
let commitPredicate = NSPredicate(format: "firstName == %@", "Arrya")
let resultAry = ary.filtered(using: commitPredicate)
print(resultAry)
【问题讨论】:
使用[Modelclass]
而不是NSMutableArray
,快捷方式
还像这样将 'let' 更改为 'var' 我已将您的代码更改为此并且工作正常 var ary:[Modelclass] = [] ary.append(userModel) let resultAry = ary.filter $0.firstName == "艾莉亚"
【参考方案1】:
我解决了这个问题, 解决方案一:
//I just added below code in model class
extension Modelclass
@objc override func value(forKey key: String) -> Any?
switch key
case "firstName":
return firstName
case "lastName":
return lastName
default:
return nil
解决方案 2:
在变量前添加@objc:
class Modelclass: NSObject
@objc var firstName:String!
@objc var lastName:String!
【讨论】:
在var firstName:String!
之前添加@objc
(=> @objc var firstName:String!
也应该这样做,避免你自己覆盖value(forKey:)
。【参考方案2】:
var
用于可变内容/变量
在swift中你可以使用filter
替代NSPredicate
试试这样:
//Model class:
class Modelclass
var firstName: String
var lastName: String
init(firstName: String, lastName: String)
self.firstName = firstName
self.lastName = lastName
// Viewcontroller doing predicate:
var ary:[Modelclass] = []
let userModel = Modelclass(firstName: "Arrya", lastName: "stark")
ary.append(userModel)
let resultAry = ary.filter $0.firstName == "Arrya"
print(resultAry)
【讨论】:
很好,这是否可以像 NSPredicate(format: "(firstName BEGINSWITH[cd] %@)","Ar") 那样过滤 BEGINSWITH 搜索? $0.firstName.hasPrefix("Ar")以上是关于NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 NSPredicate 过滤 Core Data 托管对象?
ios开发中NSArray怎么用NSPredicate来过滤数组内容
NSPredicate 与具有多个对象的 Array 一起使用