阅读 148

Swift的字典排序问题

字典的例子

let dict = ["a": 1, "b": 2, "c": 3] 复制代码

然后字典他是没有顺序的。运行的时候他的key,a,b,c会不定顺序

使用系统的方法:

let jsonData  = try? JSONSerialization.data(withJSONObject: dict, options: [])  let jsonString = String(data: jsonData!, encoding: .utf8) print(jsonString) 输出如下: Optional("{\"b\":2,\"c\":3,\"a\":1}") 复制代码

系统在iOS11的时候也有一个设置可以对字典排序

if #available(iOS 11.0, *) { let jsonData  = try? JSONSerialization.data(withJSONObject: dict, options: [.sortedKeys])  let jsonString = String(data: jsonData!, encoding: .utf8)    print(jsonString) } 输出如下: Optional("{\"a\":1,\"b\":2,\"c\":3}") 复制代码

下面找了两种排序的方法。

方法一:

func creatJsonString(dict: [String:Any]) ->String{     if(!JSONSerialization.isValidJSONObject(dict)) {         print("无法解析出JSONString")         return""     }     var namedPaird = [String]()     let sortedKeysAndValues = dict.sorted{ $0.0 < $1.0 }     for(key, value) in sortedKeysAndValues {         if value is [String:Any] {             namedPaird.append("\"\(key)\":\(creatJsonString(dict: value as! [String:Any]))")         }else if value is [Any] {             namedPaird.append("\"\(key)\":\(value)")         }else{             namedPaird.append("\"\(key)\":\"\(value)\"")         }     }     let returnString = namedPaird.joined(separator:",")     return"{\(returnString)}" } 复制代码

方法二:

class MutableOrderedDictionary: NSDictionary {     let _values: NSMutableArray = []     let _keys: NSMutableOrderedSet = []     override var count: Int {         return _keys.count     }     override func keyEnumerator() -> NSEnumerator {         return _keys.objectEnumerator()     }     override func object(forKey aKey: Any) -> Any? {         let index = _keys.index(of: aKey)         if index != NSNotFound {             return _values[index]         }         return nil     }     func setObject(_ anObject: Any, forKey aKey: String) {         let index = _keys.index(of: aKey)         if index != NSNotFound {             _values[index] = anObject         } else {             _keys.add(aKey)             _values.add(anObject)         }     } } extension MutableOrderedDictionary {     private static let defaultOrder: ((String, Any), (String, Any)) -> Bool = {         $0.0.compare($1.0, options: [.forcedOrdering, .caseInsensitive]) == .orderedAscending     }     static func sorted(object: Any, by areInIncreasingOrder: ((key: String, value: Value), (key: String, value: Value)) -> Bool = defaultOrder) -> Any {         if let dict = object as? [String: Any] {             return MutableOrderedDictionary(dict, by: areInIncreasingOrder)         } else if let array = object as? [Any] {             return array.map { sorted(object: $0, by: areInIncreasingOrder) }         } else {             return object         }     }     convenience init(_ dict: [String: Any], by areInIncreasingOrder: ((key: String, value: Value), (key: String, value: Value)) -> Bool = defaultOrder) {         self.init()         dict.sorted(by: areInIncreasingOrder)             .forEach { setObject(MutableOrderedDictionary.sorted(object: $0.value, by: areInIncreasingOrder), forKey: $0.key) }     } } 用法: // force ordering let orderedJson = MutableOrderedDictionary(jsonObject) // write pretty printed _ = JSONSerialization.writeJSONObject(orderedJson, to: outputJSON, options: [.prettyPrinted], error:


作者:清点游玩
链接:https://juejin.cn/post/7023988923269382151


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐