我想找到一个实体属性最多的单词。我正在尝试创建排序描述符以比较字符串长度。代码可以编译,但是执行提取查询时出现错误unsupported NSSortDescriptor selector: comparatorOfStringLengths
。我尝试了NSSortDescriptor
的比较器块版本,但不受支持。
query.sortDescriptors = [
NSSortDescriptor.init(key: "word", ascending: false, selector: #selector(NSString.comparatorOfStringLengths))
]
下面是比较器方法签名的最新版本。我还尝试使用带有两个参数的static
函数,并且也使用Any
而不是String
,得到相同的结果。我将此签名建模为func localizedStandardCompare(_ string: String) -> ComparisonResult
标准功能。
extension NSString {
@objc func comparatorOfStringLengths(_ b: String) -> ComparisonResult {
if self.length < b.length {
return .orderedAscending
}
if self.length > b.length {
return .orderedDescending
}
return .orderedSame
}
}
编辑:我调整/更正了选择符说明符的签名,但这也失败了:#selector(NSString.comparatorOfStringLengths(_:)))
我认为无法使用Core Data定义这样的NSPredicate
和/或NSSortDescriptor
来查询最长word
的实体。
[一个选项可能是添加一个附加属性wordlen
,该属性保存word
的长度。然后将功能validateWordlen
放入extension MyEntity { ... }
。这将由Core Data触发,并有助于将wordlen
的值与新创建或更新的实体进行同步:
@objc func validateWordlen(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {
ioValue.pointee = NSNumber.init(integerLiteral: word!.count)
}
((我的Swift 5技能很差,欢迎改正。)
然后在NSSortDescriptor
上使用wordlen
并将获取限制设置为1可以进行查询。