LAContext可以评估策略和Swift 2

Yog*_*ton 4 ios swift swift2

这是我在Swift中的代码:

if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

使用Swift2,我将代码更改为:

if #available(iOS 8, *) {
            if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) {
                return true;
            }
        }
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

调用可以抛出,但它没有标记为'try',并且没有处理错误

我究竟做错了什么?

Kam*_*xom 7

你需要做这样的事情:

do {
    try laContext.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics)

    // Call evaluatePolicy here
} catch {
    print("Cannot evaluate policy, error: \(error)")
}
Run Code Online (Sandbox Code Playgroud)

所有返回a Bool并具有inout NSError?最后一个参数的方法都会自动转换(Swift 2)以抛出错误,因此删除了参数.这Bool也是多余的,因为它等于是否inout NSError?为零

编辑:要获取有关错误的更多信息,请在catch中使用:

switch LAError(rawValue: error.code)! {
case .AuthenticationFailed:
    break
case .UserCancel:
    break
case .UserFallback:
    break
case .SystemCancel:
    break
case .PasscodeNotSet:
    break
case .TouchIDNotEnrolled:
    break
default:
    break
}
Run Code Online (Sandbox Code Playgroud)

(您可以通过CMD点击查看所有可能的错误 LAError

编辑:在Xcode 7测试版5/6这种方法不抛出了,但需要一个NSErrorPointer作为最后一个参数(一样NSURLcheckResourceIsReachableAndReturnError不知道我的原因).但是LAContext,如果您愿意,可以像以前一样扩展您的投掷方法:

extension LAContext {
    func canEvaluatePolicyThrowing(policy: LAPolicy) throws {
        var error : NSError?
        canEvaluatePolicy(policy, error: &error)
        if let error = error { throw error }
    }
}
Run Code Online (Sandbox Code Playgroud)