Sorting of an array alphabetically in swift

62,635

Solution 1

First convert NSMutableArray to the Array by using below line of code.

let swiftArray = mutableArray as AnyObject as! [String]

Use below line of code to sort the Array.

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

Check below link for sort Closures. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Update for Swift 3.0

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

Solution 2

Use this simple code of line to sort ur array

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

For Swift 4 you can use only this

let sortedNames = names.sorted(by: <)

Solution 3

Swift4

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

Solution 4

Swift 4(working code)

JSON response -> Stored 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
}
]

Code

    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)
    })

working every case (for ex: lowerCase, upperCase..)

Solution 5

For an array of objects:

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

Related videos on Youtube

anusha hrithi
Author by

anusha hrithi

Updated on July 09, 2022

Comments

  • anusha hrithi
    anusha hrithi almost 2 years

    I am new to swift.I am trying one sample app in which I need to implement the sorting of an array in alphabetical order.I getting the json data and I am adding the titles in the array.Now i would like to sort that alphabetically.Here is my code .....

    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)")
        }
    }
    

    The error message I am getting is "Cannot invoke 'sorted' with an argument list of type '(NSMutableArray, (String, String) -> Bool)'"

    I tried a lot to achieve this but I didn't find the solution. Can anyone help me to resolve this issue. Thanks In Advance.

    • jjatie
      jjatie over 7 years
      Why are you choosing to use NSArray instead of a Swift Array?
  • anusha hrithi
    anusha hrithi about 8 years
    It is showing the error like "Value of type 'NSMutableArray' has no member 'sorted'
  • Admin
    Admin about 8 years
    @anushahrithi sorted was removed, use sort instead.
  • Jigar
    Jigar about 8 years
    you must pass an array of sort descriptors (even if it's only one): var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true) var sortedResults: NSArray = results.sortedArrayUsingDescriptors([descriptor])
  • Moin Shirazi
    Moin Shirazi about 8 years
    @Kenneth Yes, in this scenario this will also work fine
  • Admin
    Admin about 8 years
    Since names looks to have the type Array<String> it wouldn't have the property name. Your call should look like names.sort { $0 < $1 }. That can even be shorted to names.sort(<).
  • jjatie
    jjatie over 7 years
    This doesn't take into account capitalization (and likely other things when translating to other languages). For example "Bag" would come before "art".
  • jjatie
    jjatie over 7 years
    Also, you can now just write .sorted() to sort in ascending order.
  • Moin Shirazi
    Moin Shirazi over 7 years
    Thanks @jjatie ... You can edit the answer and update if you have verified and tested the code
  • genaks
    genaks over 6 years
    You might want to use lowercased() for the names just in case :)
  • Zaporozhchenko Oleksandr
    Zaporozhchenko Oleksandr almost 6 years
    Don't u think that using let Obj1_Name = Obj1.firstname! like this is a bad idea? I mean any force unwrap of nil String can crash ur program)