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)
应用有 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)