试图使用NSSortDescriptor在Core Data实体中找到String属性的最大字符长度

问题描述 投票:0回答:1

我想找到一个实体属性最多的单词。我正在尝试创建排序描述符以比较字符串长度。代码可以编译,但是执行提取查询时出现错误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
    }
}

错误的屏幕截图:enter image description here

编辑:我调整/更正了选择符说明符的签名,但这也失败了:#selector(NSString.comparatorOfStringLengths(_:)))

swift core-data nssortdescriptor
1个回答
0
投票

我认为无法使用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可以进行查询。

© www.soinside.com 2019 - 2024. All rights reserved.