2015-05-13 31 views
5

App有contentid進來作爲來自JSON文件數字字符串:NSSortDescriptor評估升序編號(SWIFT)

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使核心數據以數值遞增順序返回條目:

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

但條目 - 返回爲:10,6,7,8,9。使用NSSortDescriptor正確評估這些數字的正確方法是什麼?

UPDATE:

對於斯威夫特版本,請參見下面的沃爾克的答案。我結束了使用:

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

它將數字字符串評估爲真正的整數。

UPDATE:迅捷2:

選擇語法已更改並不再接受objc指針。謝謝user1828845。

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

+0

是'contentid'內部的數字還是字符串? – Volker

+0

@Volker它是一個內部字符串。 – simplexity

+0

描述符將它們視爲數字。這就是爲什麼它顯示10之前6.可能的解決辦法是將這些數字視爲NSString。 –

回答

3

要排序的值實際上是字符串,而不是數字,因此奇怪的排列順序。用於SWIFT存在一個初始化的NSSortDescriptorinit(key:ascending:selector:)並且因此可以使用 selector: "localizedStandardCompare:"如在nshipster.com/nssortdescriptor例如描述

localizedStandardCompare:給你喜歡的方式字符串值的排序一個Finder使數字作爲自然排序你會對數字進行排序。所以1,...,9,10,...,99,100等

4

在我來說,我

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "formId", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) 它嘗試了我的工作。

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