Как отсортировать внешний массив по значению внутреннего массива? - PullRequest
2 голосов
/ 11 мая 2019

У меня есть массив кортежей, кортеж содержит массив структур Bill

let billDetails = [(name:String, bills:[Bill])]()

struct Bill {
    var date: Date
}

Внутренний массив bills уже отсортирован по свойству даты.Теперь я хочу отсортировать внешний массив на основе свойства date первого объекта внутреннего массива.

Как это сделать без принудительного развертывания?

billDetails = billDetails.sorted(by: { $0.bills.first!.date < $1.bills.first!.date })

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Вам нужно решить, куда поместить предмет, если его bills пусто.На самом деле есть только 2 варианта: либо поместить их в начало массива или в конец массива.

Вы можете использовать ??, чтобы указать значение по умолчанию distantFuture или distantPastв зависимости от того, куда вы хотите пустые счета.

// empty bills last
billDetails.sort(by: { $0.bills.first?.date ?? Date.distantFuture < $1.bills.first?.date ?? Date.distantFuture })
// or empty bills first
billDetails.sort(by: { $0.bills.first?.date ?? Date.distantPast < $1.bills.first?.date ?? Date.distantPast })
1 голос
/ 11 мая 2019

Как насчет следующего?

billDetails = billDetails.sorted(by: { lhs, rhs in
  guard !lhs.bills.isEmpty || !rhs.bills.isEmpty else {
    return false
  }

  if !lhs.bills.isEmpty, rhs.bills.isEmpty {
    return false
  }

  if lhs.bills.isEmpty, !rhs.bills.isEmpty {
    return true
  }

  return lhs.bills[0].date < rhs.bills[0].date
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...