【问题标题】:how to sort JSON string alphabetically in swift?如何在 swift 中按字母顺序对 JSON 字符串进行排序?
【发布时间】:2015-05-12 14:00:50
【问题描述】:

我正在使用 SwiftyJSON 解析来自网络的 JSON,然后在 tableView 中显示这些值。我想添加一个功能来根据用户名按字母顺序升序或降序对数据进行排序。我是 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!

}

【问题讨论】:

    标签: ios uitableview sorting swifty-json


    【解决方案1】:

    您可以使用 array.sort 对 Swift 数组进行排序

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

    详情可以参考this

    【讨论】:

    • 因为$0 &lt; $1 很直观。
    • 哈哈! @zaph 是的,我花了一些时间来了解闭包语法。
    • @zaph 我也不喜欢 $0 $1 语法。使用 Swift 闭包,您始终可以使用更详细但更清晰的形式 self.contactsArray.sort { first, second in first &lt; second }
    • @carl_h firstsecond$0$1 一样不精确。只是打字多了。任何一种方式都不表达数据类型。它可以是任何可以比较的东西。而如果你使用firstNamesecondName 之类的东西,很明显你正在处理String。并不是说任何方式都是错误的......我个人不介意这里的$0 &lt; $1 语法。它可能不会正确排序。我假设@swifty 想要一个不区分大小写的排序。
    • @BenKane 很公平,firstNamesecondName 然后为了清楚起见。听起来你真的表达了对一般类型推断的厌恶,而我表达了对 Swift 提供的速记参数名称的厌恶。此外,如果您想完全清楚,可以随时将其完整拼写出来{ (firstName: String, secondName: String) -&gt; Bool in return firstName &lt; secondName }
    【解决方案2】:

    玩了一会儿后,我找到了一个更快速友好的答案。我将把下面的 Objective-C 风格作为参考,以防万一。值得注意的是——在第一个例子中,被排序的数组必须是可变的(var not let)才能让 sort() 工作。在使用 Obj-C 排序描述符的第二个示例中,创建了一个新数组并且原始数组没有发生变异 - 类似于 sorted()

        let contact1: [String: String] = ["name" : "Dare", "email" : "d@me.com"]
        let contact2: [String: String] = ["name" : "Jack", "email" : "j@me.com"]
        let contact3: [String: String] = ["name" : "Adam", "email" : "A@me.com"]
    
        var contacts = [contact1, contact2, contact3]
    
        contacts.sort({$0["name"] <  $1["name"]})
    
        println(contacts)
    

    这被 Objective-C 破坏了一点,但似乎可以工作。这种方法相对于另一种方法的主要好处是它不区分大小写。虽然我确信有更好的方法可以用更新的语法来做同样的事情。

        let contact1: [String: String] = ["name" : "Dare", "email" : "d@me.com"]
        let contact2: [String: String] = ["name" : "Jack", "email" : "j@me.com"]
        let contact3: [String: String] = ["name" : "Adam", "email" : "A@me.com"]
    
        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 = "A@me.com";
                name = Adam;
            },
            {
                email = "d@me.com";
                name = Dare;
            },
            {
                email = "j@me.com";
                name = Jack;
            }
        ]
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2016-12-05
      • 2018-11-20
      • 2021-05-08
      相关资源
      最近更新 更多