canEvaluatePolicy Extra argument 'error' in call Swift Xcode 7
canEvaluatePolicy Extra argument 'error' in call Swift Xcode 7
我使用 Xcode 7 和 swift,我会使用 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 !")
}
}
}
)
}
}
}
如 Using Swift with Cocoa and Objective-C 中所述,所有使用 NSError
到 return 错误对象的 Objective-C 方法在从 [=22] 调用时现在将 throw
=] 2.0,所以你需要使用:
do {
try method()
} catch let error as NSError {
reportError(error)
}
正在删除 method()
调用中对 NSError
的引用。
看着Apple's documentation,似乎有些不对劲。方法签名是:
func canEvaluatePolicy(_ policy: LAPolicy, error error: NSErrorPointer) -> Bool
奇怪的是,目前该方法没有 throw
任何东西,因此没有必要将它放在 do-try 块中。我不知道(但我的猜测是)这个框架是否仍在使用 Swift 2.0 进行调整,但我想我记得它在 Xcode/Swift 中的某个时刻实现了 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")
}
我使用 Xcode 7 和 swift,我会使用 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 !")
}
}
}
)
}
}
}
如 Using Swift with Cocoa and Objective-C 中所述,所有使用 NSError
到 return 错误对象的 Objective-C 方法在从 [=22] 调用时现在将 throw
=] 2.0,所以你需要使用:
do {
try method()
} catch let error as NSError {
reportError(error)
}
正在删除 method()
调用中对 NSError
的引用。
看着Apple's documentation,似乎有些不对劲。方法签名是:
func canEvaluatePolicy(_ policy: LAPolicy, error error: NSErrorPointer) -> Bool
奇怪的是,目前该方法没有 throw
任何东西,因此没有必要将它放在 do-try 块中。我不知道(但我的猜测是)这个框架是否仍在使用 Swift 2.0 进行调整,但我想我记得它在 Xcode/Swift 中的某个时刻实现了 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")
}