【问题标题】:Cannot convert value of type '(Bool, NSError?) -> Void'无法转换类型“(Bool,NSError?)-> Void”的值
【发布时间】:2018-11-05 17:01:13
【问题描述】:

我正在构建一个提醒应用程序。我正在尝试实现所需的代码来获取保存在日历数据库中的所有提醒。

以下是我的代码的一部分:

override func viewWillAppear(_ animated: Bool) {
    // 1
    self.eventStore = EKEventStore()
    self.reminders = [EKReminder]()
    self.eventStore.requestAccessToEntityType(EKEntityType.Reminder) {(granted: Bool, error: NSError?) -> Void in
        if granted{
            // 2
            let predicate = self.eventStore.predicateForRemindersInCalendars(nil)
            self.eventStore.fetchRemindersMatchingPredicate(predicate, completion: { (reminders: [EKReminder]?) -> Void in

                self.reminders = reminders
                dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
                }
            })
        }else{
            print("The app is not permitted to access reminders, make sure to grant permission in the settings and try again")
        }
    } as! EKEventStoreRequestAccessCompletionHandler as! EKEventStoreRequestAccessCompletionHandler
}

我在这部分代码中不断收到错误:

self.eventStore.requestAccessToEntityType(EKEntityType.Reminder) {(granted: Bool, error: NSError?) -> Void in

错误是:

无法将“(Bool, NSError?) -> Void”类型的值转换为预期的参数类型“EKEventStoreRequestAccessCompletionHandler”(又名“(Bool, Optional) -> ()”)

这是在 swift 4.0 上。 关于如何解决这个问题的任何线索?我尝试了所有可用的解决方案,但找不到合适的解决方案。

【问题讨论】:

  • 试试Error 而不是NSError
  • 别忘了移除有害的强制转换as! EKEventStoreRequestAccessCompletionHandler

标签: swift


【解决方案1】:

看起来您的代码是用 Swift 2

编写的

你可以尝试在闭包中不使用参数类型:

self.eventStore.requestAccess(to: EKEntityType.reminder) { (granted, error) in
    ...
}

而且你不应该使用这些强制转换:

as! EKEventStoreRequestAccessCompletionHandler as! EKEventStoreRequestAccessCompletionHandler`

完整的Swift 4代码:

override func viewWillAppear(_ animated: Bool) {
    self.eventStore = EKEventStore()
    self.reminders = [EKReminder]()
    self.eventStore.requestAccess(to: EKEntityType.reminder) { (granted, error) in
        if granted{
            let predicate = self.eventStore.predicateForReminders(in: nil)
            self.eventStore.fetchReminders(matching: predicate, completion: { reminders in
                guard let reminders = reminders else {
                    return
                }
                self.reminders = reminders
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            })
        } else {
            print("The app is not permitted to access reminders, make sure to grant permission in the settings and try again")
        }
    }
}

【讨论】:

    【解决方案2】:

    看来你用的是旧版本的 swift 可能是 swift 2 ,应该是

    self.eventStore.requestAccessToEntityType(to: EKEntityType.reminder) { (granted, error) in }
    

    //

    在 Swift 4 中

    self.eventStore.requestAccess(to: EKEntityType.reminder) { (granted, error) in }
    

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多