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