2016-04-04 9 views
27

Sono nuovo di swift.Io sto provando un'app di esempio in cui ho bisogno di implementare l'ordinamento di un array in ordine alfabetico. Sto ottenendo i dati JSON e sto aggiungendo i titoli nel array.Now Vorrei ordinare che alphabetically.Here è il mio codice .....Ordinamento di una matrice alfabeticamente in rapido

func updateSearchResults(data: NSData?) 
{ 
    do 
    { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 

      if let blogs: NSArray = json["results"] as? [AnyObject] { 
       print(blogs) 
       for blog in blogs { 
        if let name = blog["original_title"] as? String { 
         names.addObject(name) 
        } 
       } 
       print(names) 
       **let sortedArray = sorted(names, { 
       (str1: String, str2: String) -> Bool in 
       return str1.toInt() < str2.toInt()** // Here I am getting the Error Message 
       }) 

      } 
    } 
    catch { 
     print("error serializing JSON: \(error)") 
    } 
} 

Il messaggio di errore che sto ottenendo è "non può invocare 'ordinato' con una lista di argomenti di tipo '(NSMutableArray , (String, String) -> Bool) '"

Ho provato molto per raggiungere questo obiettivo ma non ho trovato la soluzione. Qualcuno può aiutarmi a risolvere questo problema. Grazie In anticipo.

+0

Perché scegli di usare 'NSArray' invece di una' Array' Swift'? – jjatie

risposta

54

Prima conversione NSMutableArray nell'array utilizzando la riga di codice riportata di seguito.

let swiftArray = mutableArray as AnyObject as! [String] 

Utilizzare la riga di codice riportata di seguito per ordinare la matrice.

var sortedArray = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending } 

Controllare sotto il collegamento per sort chiusure. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Aggiornamento per Swift 3,0

var sortedArray = swiftArray.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending } 
+0

Viene visualizzato l'errore "Valore del tipo 'NSMutableArray' non ha un membro 'ordinato' –

+0

@anushahrithi' sorted' è stato rimosso, utilizzare 'sort'. – ColGraff

+0

è necessario superare una serie di descrittori di ordinamento (anche se è solo uno): var descrittore: NSSortDescriptor = NSSortDescriptor (chiave: "nome", ascendente: true) sortedResults var: NSArray = results.sortedArrayUsingDescriptors ([descrittore]) – iOS

17

Usa questo semplice codice di linea per ordinare ur gamma

let sortedNames = names.sort { $0.name < $1.name } 

Per Swift 4 è possibile utilizzare solo questo

let sortedNames = names.sorted(by: <) 
+0

@Kenneth Sì, in questo scenario funziona anche bene –

+1

Poiché 'names' sembra avere il tipo' Array 'non avrebbe la proprietà' nome'. La tua chiamata dovrebbe apparire come 'names.sort {$ 0 <$ 1}'. Questo può anche essere abbreviato in 'names.sort (<)'. – ColGraff

+0

Questo non tiene conto delle lettere maiuscole (e probabilmente altre cose quando si traduce in altre lingue). Ad esempio "Bag" verrebbe prima di "arte". – jjatie

-1

Prova questo

var names = [ "Alpha", "alpha", "bravo"] 
var sortedNames = names.sort { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending } 
print(sortedNames) //Logs ["Alpha", "alpha", "bravo"] 
6

Swift3

var names = [ "Alpha", "alpha", "bravo"] 
var sortedNames = names.sort { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending } 
print(sortedNames) //Logs ["Alpha", "alpha", "bravo"] 
0

Swift 3 soluzione:

let yourStringArray = [ "beTA", "ALPha", "Beta", "Alpha"] 
var sortedArray = yourStringArray.sorted() 
// Result will be ["ALPha", "Alpha", "Beta", "beTA"] 

creds a jjatie

3

Per un array di oggetti:

items = items.sorted(by: { (item1, item2) -> Bool in 
     return item1.product.name.compare(item2.product.name) == ComparisonResult.orderedAscending 
    }) 
+0

Potresti voler usare il minuscolo() per i nomi nel caso in cui :) – genaks

0

Swift 4 (codice funzionante)

risposta JSON -> memorizzati in aryNameList

"DATA": [ 
{ 
     email = "[email protected]"; 
     firstname = Harvey 
}, 
{ 
     email = "[email protected]"; 
     firstname = poonam 
}, 
{ 
     email = "[email protected]"; 
     firstname = rahul 
}, 
{ 
     email = "[email protected]"; 
     firstname = Chulbulx 
}, 
{ 
     email = "[email protected]"; 
     firstname = rahul 
}, 
{ 
     email = "[email protected]"; 
     firstname = Jay 
}, 
{ 
     email = "[email protected]"; 
     firstname = Roy 
}, 
{ 
     email = "[email protected]"; 
     firstname = Regan 
}, 
{ 
     email = "[email protected]"; 
     firstname = Jaydip 
} 
] 

Codice

self.aryNameList = self.aryNameList.sorted(by: { (Obj1, Obj2) -> Bool in 
     let Obj1_Name = Obj1.firstname! 
     let Obj2_Name = Obj2.firstname! 
     return (Obj1_Name.localizedCaseInsensitiveCompare(Obj2_Name) == .orderedAscending) 
    }) 

lavorare tutti i casi (ad es: minuscole, maiuscole ..)