我有一个简单的函数来请求访问,以便在日历中添加事件。
typealias BoolCallback = (Bool) -> ()
class SimpleCalendar {
let store: EKEventStore
init(store: EKEventStore = EKEventStore()) {
self.store = store
}
/// Request access to EventKit API for Calendar intergration
///
/// - Parameter callback: returns if access was recived or denied
func requestAccess(callback: @escaping BoolCallback) {
let status = EKEventStore.authorizationStatus(for: .event)
switch status {
case .authorized:
callback(true)
// case .notDetermined: //should ask for access
// case .denied, .restricted: //should open a ask permission view
default:
store.requestAccess(to: .event) { accessGranted, _ in
DispatchQueue.main.async {
callback(accessGranted)
}
}
}
}
}是否有一种方法来模拟EKEventStore获得状态?
我还有一个简单的函数来检查日历是否存在。
func doesCalendarExist(name: String) -> Bool {
let calendars = store.calendars(for: .event)
if calendars.contains(where: { $0.title == name }) {
return true
}
return false
}是否有一种方法来模拟存储对象以获取store.calendars
谢谢
我换了
let status = EKEventStore.authorizationStatus(for: .event)至
let status = type(of: store).authorizationStatus(for: .event)发布于 2017-08-13 07:27:23
我想你可以在这里用DI。您可以使用参数SimpleCalendar store : EKEventStore为其创建构造函数,而不是将创建存储变量的责任放在EKEventStore中,而是将其传递到那里:
init(store: EKEventStore = EKEventStore()) {/*code*/}这样,您就可以传递自己的模拟对象。
重写类方法的问题是什么?我现在不能检查,但假设这是可能的。
无论如何,其他选项是用来模拟您可以使用的所有方法- EventStoreProtocol.创建协议。我认为,这些方法必须在EKEventStore中,所以您可以使用扩展轻松地采用它:
extension EKEventStore: EventStoreProtocol {}然后,与其将EKEventStore传递给构造函数,不如将EventStoreProtocol.传递给构造函数。
您的模拟对象将不是子类,而只是确认该协议的类,实现所有必需的方法。
对于类方法,不要使用EKEventStore.authorizationStatus,而是使用类型( of : store).authorizationStatus
关于你的问题,我唯一能想到的就是下一个:
extension EKEventStore {
func eventAuthorizationStatus() -> EKAuthorizationStatus {
return EKEventStore.authorizationStatus(for: .event)
}
}然后在子类中重写此方法。因为EKEventStore是NSObject,所以它应该能工作(但我不确定)。这样,您可以调用此方法,而不是使用类型( of:.authorizationStatus)。
但问题是-你真的需要这个吗?你就不能保持原样吗?如果没有,请检查这个方法,并告诉我,如果它有效
https://stackoverflow.com/questions/45657594
复制相似问题