2015-05-12 5 views
0

Я использую SwiftyJSON для анализа JSON из Интернета, а затем отображения этих значений в tableView. Я хочу добавить функциональность для сортировки данных по алфавиту по возрастанию или по убыванию в соответствии с именами пользователей. Я новичок в Swift и имею проблемы с этим. Буду признателен за любую помощь!как сортировать строку JSON по алфавиту в swift?

override func viewDidLoad(){ 
super.viewDidLoad() 
getContactListJSON() 
} 

func getContactListJSON(){ 
let urlString = "http://jsonplaceholder.typicode.com/users" 
let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
let url = NSURL(string: urlEncodedString!) 
var task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, innerError) in 
self.json = JSON(data: data) 
self.contactsArray = json.arrayValue 

dispatch_async(dispatch_get_main_queue(), { 

} 
task.resume() 
} 

Вот как я заполняю свой tableView.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? UITableViewCell 

    if cell == nil { 
     cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: "Cell") 
    } 

    cell!.textLabel?.text = self.contactsArray[indexPath.row]["name"].stringValue 
    cell!.detailTextLabel?.text = self.contactsArray[indexPath.row]["email"].stringValue 
    return cell! 

} 

ответ

0

Поиграв немного, я нашел более быстрый ответ. Я оставлю стиль Objective-C ниже ссылкой в ​​случае, если это интересно. Обратите внимание: в этом первом примере сортируемый массив должен быть изменен (var not let) для работы sort(). Во втором примере с Obj-C рода дескрипторы новый массив создается и оригинал не мутировал - похоже на отсортированный()

let contact1: [String: String] = ["name" : "Dare", "email" : "[email protected]"] 
    let contact2: [String: String] = ["name" : "Jack", "email" : "[email protected]"] 
    let contact3: [String: String] = ["name" : "Adam", "email" : "[email protected]"] 

    var contacts = [contact1, contact2, contact3] 

    contacts.sort({$0["name"] < $1["name"]}) 

    println(contacts) 

Это испорчен немного, Objective-C, но, кажется, работает. Основное преимущество этого метода над другим заключается в том, что это нечувствительно к регистру. Хотя я уверен, что есть лучший способ сделать то же самое с новым синтаксисом.

let contact1: [String: String] = ["name" : "Dare", "email" : "[email protected]"] 
    let contact2: [String: String] = ["name" : "Jack", "email" : "[email protected]"] 
    let contact3: [String: String] = ["name" : "Adam", "email" : "[email protected]"] 

    let contacts: Array = [contact1, contact2, contact3] 

    let nameDiscriptor = NSSortDescriptor(key: "name", ascending: true, selector: Selector("caseInsensitiveCompare:")) 

    let sorted = (contacts as NSArray).sortedArrayUsingDescriptors([nameDiscriptor]) 

    println(sorted) 

// Эти распечатаны следующие

[ 
     { 
      email = "[email protected]"; 
      name = Adam; 
     }, 
     { 
      email = "[email protected]"; 
      name = Dare; 
     }, 
     { 
      email = "[email protected]"; 
      name = Jack; 
     } 
    ] 
2

Вы можете сортировать Swift массив с помощью array.sort

self.contactsArray.sort { $0 < $1 } 

Вы можете обратиться this для деталей.

+1

Поскольку '$ 0 <$ 1' является интуитивно понятным. – zaph

+0

LOL! @zaph да, взял меня на некоторое время, чтобы получить мою голову вокруг синтаксиса закрытия. – Fogmeister

+0

@zaph да, синтаксис закрытия может получить некоторое время, чтобы понять, но его точное, не так ли? Или мне нужно отредактировать и добавить подробности синтаксиса закрытия также в ответ? – sasquatch