【问题标题】:canEvaluatePolicy Extra argument 'error' in call Swift Xcode 7canEvaluatePolicy 调用 Swift Xcode 7 中的额外参数“错误”
【发布时间】:2015-06-15 14:47:33
【问题描述】:

我使用 swift 使用 Xcode 7,我会使用 Touch Id。只有当我使用 canEvaluatePolicy 时出现错误。我理解我的错误,我也称之为论点。只有当我不打电话时,它才会让我出错,因为我没有管理我的错误...... 这是我的错误和代码: PS:对不起我的英语不好。

Error : Extra argument 'error' in call

Error : Call can throw, but it is not marked with 'try' and the error is not handled

我的代码:

import Foundation
import UIKit
import LocalAuthentication

class touchid : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var lblTouchId: UILabel!

    override func viewDidLoad() {
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

    }




    @IBAction func authenticateWithTouchID(sender: AnyObject) {

        let authenticationObject = LAContext()
        self.pleaseWait()
        if authenticationObject.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics) {
            authenticationObject.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Access", reply: {(Bool, authenticationError) in

                if authenticationError != nil {
                // Authentification annulé ou Touch id non disponible
                    self.lblTouchId.text = "annulé ou touch id non disponible"
                    self.clearAllNotice()
                    self.errorNotice("Erreur !")
                }
                else {
                if Bool == true {
                    self.lblTouchId.text = "authentification réussi"
                    self.clearAllNotice()
                    self.successNotice("Succès !")
                }
                else {
                    self.lblTouchId.text = "echec de l'authentification"
                    self.clearAllNotice()
                    self.errorNotice("Erreur !")
                }
                }
                }
            )
        }
    }
}

【问题讨论】:

    标签: ios xcode ios8 xcode7


    【解决方案1】:

    正如Using Swift with Cocoa and Objective-C 中提到的,所有使用NSError 来返回错误对象的Objective-C 方法现在在从Swift 2.0 调用时都将throw,因此您需要使用:

    do {
        try method()
    } catch let error as NSError {
        reportError(error)
    }
    

    删除method() 调用中对NSError 的引用。

    【讨论】:

    • 谢谢,只是现在我的参数有另一个错误:Cannot invoke 'canEvaluatePolicy' with an argument list of type '(LAPolicy)' 这是我的代码:func canEvaluatePolicy(policy: LAPolicy) { do { try authenticationObject.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics) } catch let error as NSError { print("Error: \(error.domain)") } } if authenticationObject.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics) {
    【解决方案2】:

    看着Apple's documentation,似乎有些不对劲。方法签名是:

    func canEvaluatePolicy(_ policy: LAPolicy, error error: NSErrorPointer) -> Bool

    奇怪的是,目前,该方法没有throw 任何东西,因此没有必要将它放在do-try 块中。我不知道(但我猜是的)这个框架是否仍在使用 Swift 2.0 进行调整,但我想我记得它在 Xcode/Swift beta 迭代中的某个时间点实现了throw。有一次,编译器表现得有些古怪,并说:

    1 - 方法签名只有 1 个参数,但实现了 throws(它没有)
    2 - 但是如上所述,当你这样做时,编译器会给你不同的错误。

    需要指出的是,在撰写本文时,当前的方法签名有第二个参数,它是 NSErrorPointer,而不是 NSError?目的。像当前 Apple 文档建议的那样对待它,所以添加如下内容:

    var error: NSErrorPointer?
    let canEvaluatePolicty = LAContext().canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: error!)
    

    您的代码应该可以编译。随着更多 Beta 版迭代的问世,密切关注此框架可能是个好主意。

    祝你好运!

    【讨论】:

      【解决方案3】:

      虽然 g_blott 的答案确实可以编译,但当您不确定会发生什么时,强制展开并不是一个好习惯。

      此代码也可以编译,但不会强制解包任何内容并处理存在的错误:

          var error: NSError?
          let errorPointer: NSErrorPointer = NSErrorPointer(&error)
          let canEvaluate = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: errorPointer)
          if let error = error {
              print("Oh noes, an error! ", error)
          } else if canEvaluate {
              print("Can evaluate")
          } else {
              print("Can't evaluate")
          }
      

      【讨论】:

        猜你喜欢
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        相关资源
        最近更新 更多