2016-11-14 2 views
0

У меня есть массив NSMutableDictionary сохраняется с NSUserDefault, я хочу, чтобы отсортировать массив, основанный на ключе «метки времени» (значение является String) в каждом NSMutableDictionary: , что код я использую, чтобы получить массив:Как отсортировать массив хранилища NSMutableDictionary в NSUserDefault?

 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]) 

, а также использовать типизированный массив (после того, как с помощью нового класса)

mutableChatsArray.sortInPlace{ ($0.compare($1.timestamp) == NSComparisonResult.OrderedDescending)} 

До сих пор без успеха ... Спасибо за вашу помощь

+2

Почему бы вам не использовать массивы Swift и словари? Это проще и безопаснее и сохраняет информацию о типе. – Moritz

+0

Что вы подразумеваете под быстрыми массивами и словарями (я относительно новый в Swift, и я думал, что NSMutableArray/Dictionary также связаны с быстрым ...) Если у вас есть какие-либо предложения, я рад это услышать .. – jerem

+0

Прочтите руководство Swift, это объясняется. У Swift есть массивы и словари, нет необходимости использовать NSArray и NSDictionary, которые исходят из Foundation (они могут использоваться в Swift, но они не Swift). NSArray и NSDictionary были необходимы в Objective-C, потому что выбора не было, C-массивы ужасные - это не так с Swift. – Moritz

ответ

1

Работа с NSUserDefaults может быть очень раздражает. Обычно я следую этой методике при получении и настройке данных по умолчанию.

var mutableArray = defaults.objectForKey("Your Array") as? NSMutableArray mutableArray.sortInPlace { (a, b) -> Bool in a.start!.compare(b.start!) == NSComparisonResult.OrderedAscending } defaults.setValue(mutableArray forKey: "Your Array")

2

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]] 
1

@Rob и @Fallah, спасибо за ваши ответы, Im собирается проверить их, пока я решить мою проблему с помощью NNSSDescriptor и добавить его a селектор:

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) 
      let sortedChatsArray = (chatsArray as NSArray).sortedArrayUsingDescriptors([descriptor]) 
Смежные вопросы