NSSortDescriptor评估升序数字(Swift)

sim*_*ity 8 core-data nssortdescriptor ios swift

应用程序已contentid作为json文件中的数字字符串进入:

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

let stream:Dictionary = [
   "contentId": contentid as! String,
]
Run Code Online (Sandbox Code Playgroud)

稍后将其保存到[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)
Run Code Online (Sandbox Code Playgroud)

最后,我使用NSSortDescriptor让Core Data以数字升序返回条目:

let sort = NSSortDescriptor(key: "contentid", ascending: true)
fetchRequest.sortDescriptors = [sort]
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: "localizedStandardCompare:")
Run Code Online (Sandbox Code Playgroud)

它将编号的字符串评估为真整数.

更新:Swift 2:

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

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

use*_*845 5

就我而言,我尝试过

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "formId", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) 它为我工作.


Vol*_*ker 4

您要排序的值实际上是字符串而不是数字,因此排序顺序很奇怪。对于 Swift,存在一个初始化程序init(key:ascending:selector:)NSSortDescriptor因此您可以 selector: "localizedStandardCompare:"按照 nshipster.com/nssortdescriptor 中的描述使用

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