【问题标题】:Check Same Dates Inside ForEach Swift检查 ForEach Swift 中的相同日期
【发布时间】:2021-05-10 10:43:05
【问题描述】:

如何在 foreach 中检查第 1 项日期是否等于第 2 项日期。我可以在不使用 2 个 foreach 循环的情况下检查谓词中的相同日期吗?

struct TimedView: View {
static let taskDateFormat: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .long
    return formatter
}()
@State var releaseDate = Date()
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest var reminder: FetchedResults<CDReminder>
init(){
    var calendar = Calendar.current
    calendar.timeZone = NSTimeZone.local
    let dateFrom = calendar.startOfDay(for: Date()) // eg. 2016-10-10 00:00:00
    let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
    let predicate = NSPredicate(format : "date >= %@ AND date == %@", dateFrom as CVarArg)
    self._reminder = FetchRequest(
        entity: CDReminder.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \CDReminder.date, ascending: false)],
        predicate: predicate)
}
var body: some View {
    NavigationView {
        VStack{
            HStack{
                Text("Zamanlanmis")
                    .font(.system(size: 40, weight: .bold, design: .rounded))
                    .foregroundColor(.red)
                Spacer()
            }
            .padding(.leading)
            List{
                ForEach(reminder, id: \.self) { item in
                    DatedReminderCell(reminder: item, isSelected: false, onComplete: {})
                        .foregroundColor(.black)
                }
            }
            
        }
    }
}

现在我的输出是这样的

【问题讨论】:

  • 这取决于您所说的相等、相同日期或等于最后一秒或...?
  • 同一日期。说 itemOne.date = 01.01.2022 和 itemTwo.date = 01.01.2022 所以它应该返回 true
  • 您正在视图中进行控制器工作。不。在其他地方比较和过滤你的东西。

标签: swift date sorting foreach


【解决方案1】:

日期对象只有在它们代表完全相同的瞬间时才相等,精确到几分之一秒。

如果您想查看某个日期是否在给定的月/日/年,您将需要使用 Calendar 对象来生成 begin_of_day 和 end_of_day 日期,并查看每个日期是否在它们之间。

This thread 包括几个例子。大部分代码都在 Objective-C 中,但如果不是确切的代码,将方法转换为 Swift 应该很容易。

【讨论】:

    【解决方案2】:

    为了解决这个复杂的问题,我创建了一个名为 ScheduledViewHelper 的帮助文件。在这个助手中,我创建了一个包含两个元素(提醒和日期)的新数组。在这个助手中,我首先从核心数据中获取所有提醒,然后比较它们的所有日期数据,当我找到一个新日期时,我将日期元素附加到数组中。最后,我对这些日期进行排序并返回 [ReminderList] 以便能够从我的 ScheduledView 中获取此数组。

    我的 ScheduledViewHelper 是

     public struct ReminderList: Hashable {
        let date: String
        let reminder: [CDReminder]
    }
    
    open class ScheduledViewHelper: NSObject {
        public static let shared = ScheduledViewHelper()
        private let viewContext = PersistenceController.shared.container.viewContext
    
        private override init() {
            super.init()
        }
    
        private func getReminders() -> [CDReminder]  {
            let request: NSFetchRequest<CDReminder> = CDReminder.fetchRequest()
            do {
                let items = try viewContext.fetch(request) as [CDReminder]
                return items
            } catch {
                print("Error occured: ", error)
            }
            return []
        }
    
        public func getScheduledData() -> [ReminderList] {
            let calendar = Calendar.current
            var list: [ReminderList] = []
            var dateList: [String] = []
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "dd/MM/yyyy"
            let reminders = getReminders()
            reminders.forEach { (reminder) in
                let date = dateFormatter.string(from: reminder.date!)
                if !dateList.contains(date) && date >= dateFormatter.string(from: Date()) {
                    dateList.append(date)
                }
            }
            dateList.forEach { (date) in
                let dateFrom = calendar.startOfDay(for: dateFormatter.date(from: date)!) // eg. 2016-10-10 00:00:00
                let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
                let predicate = NSPredicate(format: "date <= %@ AND date >= %@", dateTo! as NSDate, dateFrom as NSDate)
                let request: NSFetchRequest<CDReminder> = CDReminder.fetchRequest()
                request.predicate = predicate
                do {
                    let items = try viewContext.fetch(request) as [CDReminder]
                    let newItem = ReminderList(date: date, reminder: items)
                    list.append(newItem)
                } catch {
                    print("Error occured: ", error)
                }
            }
            return list.sorted {
                $0.date < $1.date
            }
        }
    
        private func saveContext() {
            do {
                try viewContext.save()
            } catch {
                print("Error occured: ", error)
            }
        }
    
    }
    

    我在 ScheduledView 中添加了这些行:

    • 在 init() 语句之前创建了一个新的 var

      @State var 提醒列表:[提醒列表] = []

    • 在 NavigationView 下,我使用 onAppear 初始化了提醒列表

      .onAppear { 提醒列表 = ScheduledViewHelper.shared.getScheduledData() }

    • 这样重组我的列表

      列表{ ForEach(remindersList, id: .self) { item in VStack(对齐:.leading){ 文本(项目。日期) ForEach(item.reminder, id: .self) { 提醒 DatedReminderCell(reminder: 提醒, isSelected: false, onComplete: {}) } } .foregroundColor(.black) } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2015-01-04
      相关资源
      最近更新 更多