2015-05-13 17 views
5

App hat contentid aus einer JSON-Datei als Zahlenfolge kommt in:NSSortDescriptor Auswertung aufsteigende Zahlen (Swift)

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

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

Es später gespeichert wird [NSManagedObject] mit:

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) 

Schließlich Ich verwende NSSortDescriptor, um Kerndaten in numerischer aufsteigender Reihenfolge zurückzugeben:

Aber Einträge - werden zurückgegeben als: 10, 6, 7, 8, 9. Was wäre die korrekte Methode, um diese Zahlen mithilfe von NSSortDescriptor korrekt auswerten zu lassen?

UPDATE:

Für die Swift-Version finden Sie unter Volkers unten Antwort. Ich endete mit:

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

und es bewertet die nummerierten Strings als echte ganze Zahlen.

UPDATE: Swift 2:

Selector Syntax hat sich verändert und nicht mehr akzeptiert objc Zeiger. Danke user1828845.

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

+0

ist 'contentid' eine Zahl oder ein String intern? – Volker

+0

@Volker Es ist intern ein String. – simplexity

+0

Descriptor behandelt diese als Zahlen. Deshalb zeigt es 10 vor 6. Mögliche Lösung ist, diese Zahlen als NSString zu behandeln. –

Antwort

3

Die Werte, die Sie sortieren möchten sind eigentlich Strings und nicht die Zahlen, so die seltsame Sortierreihenfolge. Für Swift gibt es einen Initialisierer init(key:ascending:selector:) von NSSortDescriptor und somit können Sie selector: "localizedStandardCompare:" verwenden, wie zum Beispiel bei nshipster.com/nssortdescriptor beschrieben

Die localizedStandardCompare: gibt Ihnen einen Finder wie in einer Art und Weise der String-Werte Sortierung, dass die Zahlen natürlich sortiert werden als Du würdest Nummern sortieren. Also 1, ..., 9,10, ..., 99, 100 usw.

4

In meinem Fall habe ich versucht, es mit

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "formId", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) Sein für mich arbeiten.

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