我正在与Json合作,后者的响应类似这样
{"Type": "ABCDEF", "user_photo": "c16a8ad9bf08f966.jpg", "time": 1540399975658}
因此我通过使用自定义函数将此转换为以下格式,以便可以看到Today, Yesterday, last week, Last month
等的值。
{"Type": "ABCDEF", "user_photo": "c16a8ad9bf08f966.jpg", "time": "Today"}
现在,我正在尝试使用此结构在不同部分中的表格视图上显示此内容,每个部分显示特定时间的项目。
今天的所有项目都将在一个区域中。昨天的所有项目都将放在一个区域中,依此类推。
我有所有这些响应的数组,并且我试图将它们分组为字典,每个键值具有相同的time
键。如果我能解决这个问题,我想在部分中使用它们会很容易
我陷入了困境,不确定如何继续下去。
我尝试但失败的1个解决方案是拥有一系列Times和匹配的响应数组。尝试对Times数组进行分组,但是没有用。
答案 0 :(得分:1)
创建一个类型为[String:[Item]]的空字典。
var dict = [String: [Item]]()
遍历原始数组中的所有项目,然后做下一件事。如果没有给定名称的键,请创建一个空数组并追加一个项目,否则在现有数组中添加项目。
for item in items {
dict[item.time, default: []].append(item)
}
致电dict["Today"]
,您将获得一系列带有time =“ Today”的项目。
快捷键4
Dictionary(grouping: items, by: { $0.time })
答案 1 :(得分:1)
您可以使用原始JSON字符串中的数组,然后以自己的方式对其进行解析。
因此,您将分组问题与分析问题分开了。
如以下代码所示,并在操场上尝试。
let array = ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"last week\"}", "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Tomorrow\"}" , "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}","{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}"]
let re = try NSRegularExpression.init(pattern: "(\\\"([^\"])*\\\")[\\s}]+$", options: [.anchorsMatchLines ,. allowCommentsAndWhitespace])
let dict = Dictionary.init(grouping: array) {
return ($0 as NSString).substring(with: re.matches(in: $0, options: [], range: NSRange.init(location: 0, length: $0.count))[0].range(at: 1))
}
print(dict)
结果是:
["\"last week \"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"last week \" }"], "\"Tomorrow\"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Tomorrow\"}"], "\"Today\"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}", "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}"]]
答案 2 :(得分:0)
您可以定义一个包含所有通知的字典:
var notifcationsDict: [String: [Notification]] = ["Today": [],
"Yesterday": [],
"Last week": [],
"Last month": [],]
定义通知结构:
struct Notification: Decodable {
let type, userPhoto, time: String
enum CodingKeys: String, CodingKey {
case type = "Type"
case userPhoto = "user_photo"
case time
}
}
(请注意使用编码键来遵循Swift的命名属性方式)
然后您可以解码json并将通知附加到字典中的相应键:
let json = """
{
"Type": "ABCDEF",
"user_photo": "c16a8ad9bf08f966.jpg",
"time": "Today"
}
"""
guard let jsonData = json.data(using: .utf8) else {
fatalError("Couldn't get the json to data")
}
do {
let notification = try JSONDecoder().decode(Notification.self, from: jsonData)
notifcationsDict[notification.time]?.append(notification)
print(notifcationsDict)
} catch {
print(error)
}