首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟EKEventStore

如何模拟EKEventStore
EN

Stack Overflow用户
提问于 2017-08-13 06:01:46
回答 1查看 632关注 0票数 3

我有一个简单的函数来请求访问,以便在日历中添加事件。

代码语言:javascript
复制
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获得状态?

我还有一个简单的函数来检查日历是否存在。

代码语言:javascript
复制
func doesCalendarExist(name: String) -> Bool {
    let calendars = store.calendars(for: .event)

    if calendars.contains(where: { $0.title == name }) {
        return true
    }

    return false
}

是否有一种方法来模拟存储对象以获取store.calendars

谢谢

我换了

代码语言:javascript
复制
let status = EKEventStore.authorizationStatus(for: .event)

代码语言:javascript
复制
let status = type(of: store).authorizationStatus(for: .event)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 07:27:23

我想你可以在这里用DI。您可以使用参数SimpleCalendar store : EKEventStore为其创建构造函数,而不是将创建存储变量的责任放在EKEventStore中,而是将其传递到那里:

代码语言:javascript
复制
init(store: EKEventStore = EKEventStore()) {/*code*/}

这样,您就可以传递自己的模拟对象。

重写类方法的问题是什么?我现在不能检查,但假设这是可能的。

无论如何,其他选项是用来模拟您可以使用的所有方法- EventStoreProtocol.创建协议。我认为,这些方法必须在EKEventStore中,所以您可以使用扩展轻松地采用它:

代码语言:javascript
复制
extension EKEventStore: EventStoreProtocol {}

然后,与其将EKEventStore传递给构造函数,不如将EventStoreProtocol.传递给构造函数。

您的模拟对象将不是子类,而只是确认该协议的类,实现所有必需的方法。

对于类方法,不要使用EKEventStore.authorizationStatus,而是使用类型( of : store).authorizationStatus

关于你的问题,我唯一能想到的就是下一个:

代码语言:javascript
复制
extension EKEventStore {
   func eventAuthorizationStatus() -> EKAuthorizationStatus {
      return EKEventStore.authorizationStatus(for: .event)
   }
}

然后在子类中重写此方法。因为EKEventStoreNSObject,所以它应该能工作(但我不确定)。这样,您可以调用此方法,而不是使用类型( of:.authorizationStatus)。

但问题是-你真的需要这个吗?你就不能保持原样吗?如果没有,请检查这个方法,并告诉我,如果它有效

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45657594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档