NSSortDescriptor 评估升序数字 (Swift)

NSSortDescriptor evaluating ascending numbers (Swift)

应用有 contentid 来自 json 文件的数字字符串:

let contentid: AnyObject! = jsonFeed["contentid"]

let stream:Dictionary = [
   "contentId": contentid as! String,
]

稍后保存到 [NSManagedObject] 中:

var articles = [NSManagedObject]()

let entity =  NSEntityDescription.entityForName("Article", inManagedObjectContext: managedContext)
let article = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

article.setValue(stream["contentId"], forKey: "contentid")

articles.append(article)

最后,我使用 NSSortDescriptor 使核心数据 return 条目按数字升序排列:

let sort = NSSortDescriptor(key: "contentid", ascending: true)
fetchRequest.sortDescriptors = [sort]

但条目 6 - 10 被 returned 为:10, 6, 7, 8、9。使用 NSSortDescriptor 正确评估这些数字的正确方法是什么?

更新:

对于 Swift 版本,请参阅下面 Volker 的回答。我最终使用了:

let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: "localizedStandardCompare:")

并将编号字符串评估为真正的整数。

更新:Swift 2:

选择器语法已更改,不再接受 objc 指针。谢谢 user1828845.

let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))

您要排序的值实际上是字符串而不是数字,因此排序顺序很奇怪。对于 Swift 存在 NSSortDescriptor 的初始值设定项 init(key:ascending:selector:) 因此您可以使用 selector: "localizedStandardCompare:" 如 nshipster 所述。com/nssortdescriptor

localizedStandardCompare: 为您提供了一个类似 Finder 的字符串值排序方式,数字自然排序就像您对数字排序一样。所以 1,...,9,10,...,99, 100 等等

就我而言,我尝试使用

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "formId", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) 它对我有用。

        let descriptor: NSSortDescriptor = NSSortDescriptor(key: "message_time", ascending: true)
        let sortedResults = arrayForMessages.sortedArray(using: [descriptor])
        print(sortedResults)