2016-04-04 3 views
27

Я новичок в swift.Я пробую одно примерное приложение, в котором мне нужно реализовать сортировку массива в алфавитном порядке. Я получаю json-данные, и добавляю заголовки в array.Now я хотел бы разобраться, что alphabetically.Here мой код .....Сортировка массива в алфавитном порядке в swift

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

сообщение об ошибке я получаю «не может ссылаться на„отсортированный“со списком аргументов типа«(NSMutableArray , (String, String) -> Bool) '"

Я пробовал много для этого, но я не нашел решение. Может ли кто-нибудь помочь мне решить эту проблему. Спасибо заранее.

+0

Почему вы выбираете 'NSArray' вместо Swift' Array'? – jjatie

ответ

54

Первый конвертировать NSMutableArray в массив с использованием следующей строки кода.

let swiftArray = mutableArray as AnyObject as! [String] 

Используйте следующую строку кода для сортировки.

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

Проверьте нижеследующую ссылку для sort Закрытия. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Обновление для Swift 3.0

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

Показана ошибка, например: «Значение типа« NSMutableArray »не имеет члена« отсортировано » –

+0

@anushahrithi' sorted' удален, вместо этого используйте 'sort'. – ColGraff

+0

вы должны передать массив сортировки дескрипторов (даже если это только один): уага дескриптора: NSSortDescriptor = NSSortDescriptor (ключ: "имя", по возрастанию: правда) Var sortedResults: NSArray = results.sortedArrayUsingDescriptors ([дескриптор]) – iOS

17

Используйте этот простой код линии для сортировки ур массив

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

Для Swift 4 вы можете использовать только этот

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

@ Kenneth Да, в этом случае это также будет работать нормально –

+1

Так как 'names' выглядит как' Array ', у него не было бы свойства' name'. Ваш вызов должен выглядеть как 'names.sort {$ 0 <$ 1}'. Это может быть даже сокращено до 'names.sort (<)'. – ColGraff

+0

Это не учитывает капитализацию (и, вероятно, другие вещи при переводе на другие языки). Например, «Сумка» должна была предшествовать «искусству». – jjatie

-1

Попробуйте это

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

Свифта 3 Решение:

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

кредитки к jjatie

3

Для массива объектов:

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

Возможно, вы захотите использовать lowercased() для имен на всякий случай :) – genaks

0

Swift 4 (рабочий код)

JSON ответ -> Хранится в 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 
} 
] 

Код

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

работает каждый случай (напр: LOWERCASE, прописные ..)