You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

父类EKCalendarItem数组存储EKEvent、EKReminder实例为何被静默丢弃?

EKCalendarItem数组添加EKEvent/EKReminder实例被静默丢弃的解决办法

我开发了一款日历查看器,希望同时使用日历事件EKEvent和提醒事件EKReminder。二者均为EKCalendarItem的子类,因此我尝试创建[EKCalendarItem]类型数组,向其中添加EKEvent与EKReminder实例,但发现实例被静默丢弃。以下是我在Swift Playground中编写的测试代码:

var superClassArray:[EKCalendarItem] = []

let reminder = EKReminder()
print(reminder)
let calEvent = EKEvent()
print(calEvent)

superClassArray.append(reminder)
superClassArray.append(calEvent)
print(superClassArray)

问题原因

直接通过无参构造器创建的EKEvent和EKReminder实例是无效的——这两个类必须关联到一个有效的EKCalendar对象才能被正常持有和使用。如果未设置calendar属性,这些实例会被系统判定为无效对象,添加到数组后会被自动释放,表现为"静默丢弃"。

解决方案

要创建可正常使用的实例并添加到数组,需按以下步骤操作:

  1. 初始化EKEventStore并请求日历、提醒事项的访问权限
  2. 获取可用的目标日历(如系统默认日历)
  3. 使用带EKEventStore参数的构造器创建实例,并关联对应的日历

修正后的测试代码

import EventKit

// 初始化事件存储对象
let eventStore = EKEventStore()

// 先请求日历权限,再请求提醒事项权限
eventStore.requestAccess(to: .event) { eventGranted, _ in
    eventStore.requestAccess(to: .reminder) { reminderGranted, _ in
        // 确保权限都已获取
        guard eventGranted, reminderGranted else { return }
        
        // 获取默认的事件日历和提醒日历
        guard let defaultEventCalendar = eventStore.defaultCalendarForNewEvents,
              let defaultReminderCalendar = eventStore.defaultCalendarForNewReminders else { return }
        
        var superClassArray: [EKCalendarItem] = []
        
        // 创建有效的提醒实例并关联日历
        let reminder = EKReminder(eventStore: eventStore)
        reminder.calendar = defaultReminderCalendar
        print(reminder)
        
        // 创建有效的日历事件实例并关联日历
        let calEvent = EKEvent(eventStore: eventStore)
        calEvent.calendar = defaultEventCalendar
        print(calEvent)
        
        // 添加到数组
        superClassArray.append(reminder)
        superClassArray.append(calEvent)
        print(superClassArray)
    }
}

补充说明

  • 权限请求是必要步骤,没有权限无法访问日历和提醒事项相关的资源
  • 关联日历后,实例的内存管理会正常工作,添加到数组后不会被静默释放
  • 也可以使用无参构造器创建实例后,手动设置calendar属性,但推荐使用带EKEventStore参数的构造器,这是EventKit框架的规范用法

内容的提问来源于stack exchange,提问作者benc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:20:17