Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在NSUserDefault中对NSMutableDictionary存储的数组进行排序?_Swift_Sorting_Nsmutablearray_Nsmutabledictionary - Fatal编程技术网

Swift 如何在NSUserDefault中对NSMutableDictionary存储的数组进行排序?

Swift 如何在NSUserDefault中对NSMutableDictionary存储的数组进行排序?,swift,sorting,nsmutablearray,nsmutabledictionary,Swift,Sorting,Nsmutablearray,Nsmutabledictionary,我使用NSUserDefault保存了NSMutableDictionary的数组,我想根据每个NSMutableDictionary中的“timestamp”键(值为字符串)对数组进行排序: 我用于检索数组的代码: if let chatsArray = NSUserDefaults().arrayForKey("myChatsList") as? [NSMutableDictionary]{ print(chatsArray) //s

我使用NSUserDefault保存了NSMutableDictionary的数组,我想根据每个NSMutableDictionary中的“timestamp”键(值为字符串)对数组进行排序: 我用于检索数组的代码:

     if let chatsArray = NSUserDefaults().arrayForKey("myChatsList") as? [NSMutableDictionary]{
            print(chatsArray)
            //sort the array
            print(sortedArray)
     }
这就是我的阵列的外观:

[{
    eventBadge = 1;
    eventId = "-KWE39B6Dh7rDzaF-xy4";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 20;
    unreadMessage = 2;
}, {
    eventBadge = 1;
    eventId = "-KWWc99ex8f7ksq8TR2U";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 5;
    unreadMessage = 1;
}, {
    eventBadge = 1;
    eventId = "-KWE5OYRZnZ5-p3LUotL";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 10;
    unreadMessage = 2;
}]
我尝试使用NSSDescriptor:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true)
chatsArray.sortedArrayUsingDescriptors([descriptor])
以及使用类型化数组(在使用新类之后)

到目前为止没有成功。。。
感谢您的帮助

使用NSUserDefaults可能非常烦人。在从默认值获取和设置数据时,我通常采用这种技术

var mutableArray=defaults.objectForKey(“您的数组”)作为?可变数组
mutableArray.sortInPlace{(a,b)->Bool-in
a、 开始!.compare(b.start!)==NSComparisonResult.OrderedAscending
}

setValue(mutableArray-forKey:“您的数组”)

使用NSUserDefaults可能会非常烦人。在从默认值获取和设置数据时,我通常采用这种技术

var mutableArray=defaults.objectForKey(“您的数组”)作为?可变数组
mutableArray.sortInPlace{(a,b)->Bool-in
a、 开始!.compare(b.start!)==NSComparisonResult.OrderedAscending
}

defaults.setValue(可变数组forKey:“您的数组”)

Swift 3示例

  let chatsArray = [[
        "eventBadge" : 1,
        "eventId" : "-KWE39B6Dh7rDzaF-xy4",
        "lastMessage" : "uyfgduihgvifudhviufhvdf",
        "timestamp" : 20,
        "unreadMessage" : 2,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWWc99ex8f7ksq8TR2U",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 5,
            "unreadMessage" : 1,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWE5OYRZnZ5-p3LUotL",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 10,
            "unreadMessage" : 2,
    ]] as [[String:Any]]

    // to get the timestamp value and store it inside an array with order
    let arrayTimeStamp = (chatsArray.flatMap{$0["timestamp"]} as! Array<Int>).sorted(by: >)
    print(arrayTimeStamp) // [20, 10, 5]

    //to order an array of dictionaries

    let TimeStamp = chatsArray.sorted{$0["timestamp"] as! Int > $1["timestamp"] as! Int }

    print(TimeStamp)

//[["eventId": "-KWE39B6Dh7rDzaF-xy4", "lastMessage":"uyfgduihgvifudhviufhvdf", "timestamp": 20, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWE5OYRZnZ5-p3LUotL", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 10, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWWc99ex8f7ksq8TR2U", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 5, "unreadMessage": 1, "eventBadge": 1]]
让chatsArray=[[
“活动徽章”:1,
“事件ID”:“-KWE39B6Dh7rDzaF-xy4”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:20,
“未读信息”:2,
], [
“活动徽章”:1,
“事件ID”:“-KWWc99ex8f7ksq8TR2U”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:5,
“未读消息”:1,
], [
“活动徽章”:1,
“事件ID”:“-KWE5OYRZnZ5-P3LOOTL”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:10,
“未读信息”:2,
]]as[[String:Any]]
//获取时间戳值并按顺序将其存储在数组中
让arrayTimeStamp=(chatsArray.flatMap{$0[“timestamp”]}作为!数组)。排序(按:>)
打印(arrayTimeStamp)//[20,10,5]
//对字典数组进行排序
让TimeStamp=chatsArray.sorted{$0[“TimeStamp”]as!Int>$1[“TimeStamp”]as!Int}
打印(时间戳)
//[[“eventId”:“-KWE39B6Dh7rDzaF-xy4”,“lastMessage”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“timestamp”:20,“unreadMessage”:2,“eventBadge”:1],
//[“事件ID”:“-KWE5OYRZnZ5-P3LOOTL”,“最后消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“时间戳”:10,“未发送消息”:2,“事件徽章”:1],
//[“eventId”:“-KWWc99ex8f7ksq8TR2U”,“lastMessage”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“timestamp”:5,“unreadMessage”:1,“eventBadge”:1]]

Swift 3示例

  let chatsArray = [[
        "eventBadge" : 1,
        "eventId" : "-KWE39B6Dh7rDzaF-xy4",
        "lastMessage" : "uyfgduihgvifudhviufhvdf",
        "timestamp" : 20,
        "unreadMessage" : 2,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWWc99ex8f7ksq8TR2U",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 5,
            "unreadMessage" : 1,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWE5OYRZnZ5-p3LUotL",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 10,
            "unreadMessage" : 2,
    ]] as [[String:Any]]

    // to get the timestamp value and store it inside an array with order
    let arrayTimeStamp = (chatsArray.flatMap{$0["timestamp"]} as! Array<Int>).sorted(by: >)
    print(arrayTimeStamp) // [20, 10, 5]

    //to order an array of dictionaries

    let TimeStamp = chatsArray.sorted{$0["timestamp"] as! Int > $1["timestamp"] as! Int }

    print(TimeStamp)

//[["eventId": "-KWE39B6Dh7rDzaF-xy4", "lastMessage":"uyfgduihgvifudhviufhvdf", "timestamp": 20, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWE5OYRZnZ5-p3LUotL", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 10, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWWc99ex8f7ksq8TR2U", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 5, "unreadMessage": 1, "eventBadge": 1]]
让chatsArray=[[
“活动徽章”:1,
“事件ID”:“-KWE39B6Dh7rDzaF-xy4”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:20,
“未读信息”:2,
], [
“活动徽章”:1,
“事件ID”:“-KWWc99ex8f7ksq8TR2U”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:5,
“未读消息”:1,
], [
“活动徽章”:1,
“事件ID”:“-KWE5OYRZnZ5-P3LOOTL”,
“最新消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,
“时间戳”:10,
“未读信息”:2,
]]as[[String:Any]]
//获取时间戳值并按顺序将其存储在数组中
让arrayTimeStamp=(chatsArray.flatMap{$0[“timestamp”]}作为!数组)。排序(按:>)
打印(arrayTimeStamp)//[20,10,5]
//对字典数组进行排序
让TimeStamp=chatsArray.sorted{$0[“TimeStamp”]as!Int>$1[“TimeStamp”]as!Int}
打印(时间戳)
//[[“eventId”:“-KWE39B6Dh7rDzaF-xy4”,“lastMessage”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“timestamp”:20,“unreadMessage”:2,“eventBadge”:1],
//[“事件ID”:“-KWE5OYRZnZ5-P3LOOTL”,“最后消息”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“时间戳”:10,“未发送消息”:2,“事件徽章”:1],
//[“eventId”:“-KWWc99ex8f7ksq8TR2U”,“lastMessage”:“UYFGDUIHGVIFUDHVIUFHVDFDF”,“timestamp”:5,“unreadMessage”:1,“eventBadge”:1]]

@Rob和@Fallah,谢谢你的回答,我会检查它们,现在我使用NNSSDescriptor解决了我的问题,并将其添加为选择器:

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
            let sortedChatsArray = (chatsArray as NSArray).sortedArrayUsingDescriptors([descriptor]) 

@Rob和@Fallah,谢谢你的回答,我将检查它们,现在我使用NNSSDescriptor解决我的问题,并将其添加为选择器:

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
            let sortedChatsArray = (chatsArray as NSArray).sortedArrayUsingDescriptors([descriptor]) 

为什么不使用Swift数组和字典呢?你所说的swift数组和字典是什么意思(我在swift比较新,我认为NSMUTABLEARRY/字典也与swift相关。)如果你有任何建议,我很高兴听到。阅读swift手册,它已经解释过了。SWIFT有数组和字典,不需要使用NSCORE和NSDictionary,它们都来自基金会(它们在SWIFT中可用,但它们不是SWIFT)。Objective-C中需要NSArray和NSDictionary,因为别无选择,C数组太糟糕了——Swift不再适用。为什么不使用Swift数组和字典?你所说的swift数组和字典是什么意思(我在swift比较新,我认为NSMUTABLEARRY/字典也与swift相关。)如果你有任何建议,我很高兴听到。阅读swift手册,它已经解释过了。SWIFT有数组和字典,不需要使用NSCORE和NSDictionary,它们都来自基金会(它们在SWIFT中可用,但它们不是SWIFT)。Objective-C中需要NSArray和NSDictionary,因为别无选择,C数组太糟糕了——Swift不再适用。