【问题标题】:How to sort NSmutableArray from one of it indexes (lat lng coordinates) in Swift如何从 Swift 中的一个索引(lat lng 坐标)对 NSmutableArray 进行排序
【发布时间】:2016-10-09 08:31:00
【问题描述】:

我是 swift 的新手,我知道如何在 php 中做到这一点,但我对所有这些词典感到迷茫,我不知道如何在 swift 2 中做到这一点。我一直在谷歌搜索虽然并没有找到我需要的东西。

我正在解析一个 jSon 并将它的值存储在一个循环中的 NSMutableDictionary 中,在循环结束时我将 NSMutableDictionary 存储在一个 NSMutableArray 中,所以最后我有一个包含 43 个元素的 NSMutableArray,每个元素都有大约 10 个键及其值。我需要从它们的“距离”键中对这 43 个元素进行排序,然后按降序对它们进行排序。我不知道目前的方法是否可行。键“距离”的值是一个整数(米)。我不知道在 NSMutable 数组中使用 NSMutableDictionary 是否是正确的方法,但我正在使用它,因为它可能有字符串键,而不是数字索引,所以对我来说更容易访问键“距离”比索引 8...

首先我加载 json 内容:

private func parseJson(json : NSMutableArray, tableView : UITableView){

        var c : Int = 0
        for j in json {
            var jsonValues = NSMutableDictionary()

            //Create main value
            guard let value = j.valueForKey("value")?.valueForKey("value")! else{
                continue
            }

            //Get name
            guard let Name : String = (value.valueForKey("Name")?.valueForKey("en") as? String) else {
                continue
            }
jsonValues["name"] = Name

//more code like this....

            TableData.append(Name)
            nsDict.insertObject(jsonValues, atIndex: c)

            c += 1
        }

这是我加载后的 NSMutableArray 内容:

这是我到目前为止的代码。我试图将排序后的内容加载到一个新数组中,但是在这个新数组中缺少一些键。

//Reorder Array by shop distance from user...
var sortDescriptor:NSSortDescriptor = NSSortDescriptor(key: "distance", ascending: true)
var sortedArray : NSArray = nsDict.sortedArrayUsingDescriptors([sortDescriptor])//Crashes

print(sortedArray)

【问题讨论】:

  • 最方便的解决方案是使用 Swift 原生集合类型(Array<>Dictionary<>)和sort 函数。
  • 你能给我看一个这个案例的例子吗?
  • 我不知道 JSON 包含什么,但尝试将 NSMutableArray 替换为 [[String:AnyObject]]NSMutableDictionary 替换为 [String:AnyObject]。然后用array.sortInPlace {$0.distance < $1.distance }对数组进行排序
  • 将 NSMutableArray 更改为 [String : AnyObject] 是什么意思??
  • 我的意思是 使用 Swift 原生集合类型,但这不是正确的替代品。

标签: ios arrays swift sorting swift2


【解决方案1】:

我已经设法用这种技术对数组进行了排序:

为我的数组创建了一个新类

import Foundation
class JsonArrayValues  {

    init(){

    }
    var name = String()
    var distance = Float()
    var lat = Float()
    var lng = Float()
    var openingTime = String()
    var country = String()
    var code = String()
    var address = String()
    var categories = String()
    var city = String()
    var type = String()
    var brands = String()





}

我在循环之前实例化了一个:

var jsonArrData : [JsonArrayValues] = []

循环中的另一个,我在其中添加了值:

        var c : Int = 0
        for j in json {
            var jsonValues : JsonArrayValues = JsonArrayValues()

//Get name
            guard let Name : String = (value.valueForKey("Name")?.valueForKey("en") as? String) else {
                continue
            }
            jsonValues.name = Name
//more code...
jsonArrData.append(jsonValues)

            c += 1
        }

最后我已经能够调用函数来重新排列数组了:

   //Reorder Array by shop distance from user...
    jsonArrData.sortInPlace({$0.distance < $1.distance}) 

【讨论】:

    【解决方案2】:

    在任何不平凡的项目中,您的第一步确实应该是花一些时间在 github 上四处寻找可以简化您的问题的工具。在这种情况下,您会发现有很多工具可以简化在 Swift 中使用 JSON 的过程。我建议你特别看看EVReflectionGloss,虽然也有很多人使用SwiftyJSON

    您没有提及您是如何访问网络的;您可以查看AFNetworkingAlamofire。后者也有AlamofireJsonToObjects 帮忙。

    我还发现JSONExport 非常有用。

    您将花费更少的时间来处理这个不幸的问题中的细节,而更多地实现您的更大目标。

    【讨论】:

    • 找工具很好,但我更喜欢先学后用
    猜你喜欢
    • 2016-02-01
    • 2013-04-13
    • 1970-01-01
    • 2018-02-19
    • 2014-10-16
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多