Я пытаюсь воссоздать представление, которое соответствует списку событий в стандартном приложении iOS Calendar. У меня есть следующий код, который генерирует список событий с каждым событием, разделенным на свой раздел по дате:
var body: some View {
NavigationView {
List {
ForEach(userData.occurrences) { occurrence in
Section(header: Text("\(occurrence.start, formatter: Self.dateFormatter)")) {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
}
}
.navigationBarTitle(Text("Events"))
}.onAppear(perform: populate)
}
Проблема с этим кодом заключается в том, что если в одну и ту же дату есть два события, ониразделенные на разные разделы с одинаковым названием вместо того, чтобы группироваться в один и тот же раздел.
Как новичок в Swift, мой инстинкт должен сделать что-то вроде этого:
ForEach(userData.occurrences) { occurrence in
if occurrence.start != self.date {
Section(header: Text("\(occurrence.start, formatter: Self.dateFormatter)")) {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
} else {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
self.date = occurrence.start
Но в Swift, это дает мне ошибку «Невозможно определить сложный тип возврата замыкания; добавить явный тип для устранения неоднозначности», потому что я вызываю произвольный код (self.date = adventrence.start) внутри ForEach {}, что недопустимо.
Как правильно это реализовать? Есть ли более динамичный способ выполнить это, или мне нужно каким-то образом абстрагировать код вне ForEach {}?
Редактировать: Объект Occurrence выглядит следующим образом:
struct Occurrence: Hashable, Codable, Identifiable {
var id: Int
var title: String
var description: String
var location: String
var start: Date
var end: String
var cancelled: Bool
var public_occurrence: Bool
var created: String
var last_updated: String
private enum CodingKeys : String, CodingKey {
case id, title, description, location, start, end, cancelled, public_occurrence = "public", created, last_updated
}
}
Обновление: Следующий код получил мне словарь, который содержит массивы вхождений, обозначенных одной и той же датой:
let myDict = Dictionary( grouping: value ?? [], by: { occurrence -> String in
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
return dateFormatter.string(from: occurrence.start)
})
self.userData.latestOccurrences = myDict
Однако, если я попытаюсь использовать это в моем представлении следующим образом:
ForEach(self.occurrencesByDate) { occurrenceSameDate in
// Section(header: Text("\(occurrenceSameDate[0].start, formatter: Self.dateFormatter)")) {
ForEach(occurrenceSameDate, id: occurrenceSameDate.id){ occurrence in
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
// }
}
(Раздел закомментирован, пока я работаю с основным битом)
Я получаю эту ошибку: Невозможно преобразовать значение типа '_.Element' в ожидаемый тип аргумента 'Вхождение'