Вы должны использовать Codable
вместо SwiftyJSON
, так как он напечатан более явно, но, отвечая на ваш вопрос непосредственно в отношении SwiftyJSON
, вы могли бы пойти с этим:
func processedTransactions(_ transactions: JSON) -> [(date: String, nominal: Double)] {
let processedTransactions = transactions
.arrayValue
.reduce(into: [String: Double]()) { (r, t) in
if let date = t["order_created"].stringValue.split(separator: " ").first {
let date = String(date)
r[date] = r[date, default: 0] + (Double(t["nominal"].stringValue) ?? 0)
}
}
.sorted { $0.key > $1.key }
.map { (date: $0.key, nominal: $0.value) }
return processedTransactions
}
func handleProcessedTransactions(_ transactions: [(date: String, nominal: Double)]) {
//do something with your sorted transactions
for t in transactions {
print(t.date, t.nominal)
}
}
Здесь, в processedTransactions(_:)
, мы в основном перебираем даты и готовим уникальные записи, основанные только на части YYYY-DD-MM
.
Одновременно мы ведем учет общей суммы номинальной стоимости, относящейся к определенной дате.
Это сделано в части reduce
( Логика, которую я использовал, является базовой манипуляцией со строками, но можно утверждать, что это ошибка, поэтому не стесняйтесь переписать эту часть )
Затем мы sort
это и просто для лучшей читаемости, мы map
воссоздаем объект как кортежи (date: String, nominal: String)
Затем мы можем передать это в handleProcessedTransactions(_:)
и задействовать на нем требуемую логику.
Кроме того, вы, похоже, используете UserDefaults
, поэтому вот как может выглядеть существующая часть вашего кода:
override func viewDidLoad() {
super.viewDidLoad()
fetchData()
let json = UserDefaults.standard.object(forKey: "transactions")
let transactions = processedTransactions(JSON(json))
handleProcessedTransactions(transactions)
}
func fetchData() {
let url = ""
Alamofire
.request(url, method: .get, encoding: JSONEncoding.default)
.responseJSON { (response) in
switch response.result {
case .success(let value):
let json = JSON(value)
let transactionJSON = json["data"]["transaction"]
UserDefaults.standard.set(transactionJSON.arrayObject, forKey: "transactions")
//you probably want to handle it here too
let transactions = self.processedTransactions(transactionJSON)
self.handleProcessedTransactions(transactions)
case .failure(let error):
print(error)
}
}
}