如何在 swift 中按字母顺序对 JSON 字符串进行排序?
how to sort JSON string alphabetically in swift?
我正在使用 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!
}
您可以使用 array.sort
对 Swift 数组进行排序
self.contactsArray.sort { [=10=] < }
详情可参考this
经过一番尝试后,我发现了一个 swift 更友好的答案。我将在下面留下 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({[=10=]["name"] < ["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;
}
]
我正在使用 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!
}
您可以使用 array.sort
self.contactsArray.sort { [=10=] < }
详情可参考this
经过一番尝试后,我发现了一个 swift 更友好的答案。我将在下面留下 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({[=10=]["name"] < ["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;
}
]