繁体   English   中英

canEvaluatePolicy调用Swift Xcode 7中的额外参数“错误”

[英]canEvaluatePolicy Extra argument 'error' in call Swift Xcode 7

我迅速使用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 !")
                }
                }
                }
            )
        }
    }
}

如在Swift与Cocoa和Objective-C结合使用中所述,从Swift 2.0调用时,所有使用NSError返回错误对象的Objective-C方法现在都将throw ,因此您需要使用:

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

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

查看苹果的文档 ,似乎有些不对劲。 方法签名为:

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

奇怪的是,该方法目前不会throw任何东西,因此没有必要将其放入尝试代码块。 我不知道该框架是否仍在使用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的更多迭代出现,密切关注此框架可能是一个好主意。

祝好运!

尽管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")
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM