canEvaluatePolicy Дополнительный аргумент «ошибка» при вызове Swift Xcode 7

Я работаю с Xcode 7 с быстрым, и я бы использовал Touch Id. Только у меня ошибка при использовании canEvaluatePolicy. Я понимаю свою ошибку, я тоже вызываю аргумент. Только если я не звоню, это выдает мне ошибку, потому что я не справился со своей ошибкой... Вот моя ошибка и мой код: PS: извините за мой плохой английский.

Error : Extra argument 'error' in call

or

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 !")
                }
                }
                }
            )
        }
    }
}

person hgcahez    schedule 15.06.2015    source источник


Ответы (3)


Как указано в При использовании Swift с Cocoa и Objective-C все методы Objective-C, которые используют NSError для возврата объекта ошибки, теперь будут throw при вызове из Swift 2.0, поэтому вам нужно использовать:

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

Удаление ссылки на NSError в вызове method().

person Droppy    schedule 15.06.2015
comment
Спасибо, только теперь у меня другая ошибка с аргументом: 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) { - person hgcahez; 15.06.2015

Глядя на документация Apple, что-то не так. Сигнатура метода:

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

Странно то, что в настоящее время метод throw ничего не делает, поэтому помещать его в блок do-try не нужно. Я не знаю (но я предполагаю, что да) этот фреймворк все еще настраивается с помощью Swift 2.0, но я подумал, что помню, как он реализовывал throw в какой-то момент в бета-итерациях Xcode/Swift. В какой-то момент компилятор вел себя немного странно и сказал, что:

1 - сигнатура метода имеет только 1 параметр, но реализует throws (чего нет)
2 - но, как упоминалось выше, когда вы это делаете, компилятор выдает разные ошибки.

Следует отметить, что текущая сигнатура метода на момент написания этой статьи имеет второй параметр, который является NSErrorPointer, а не NSError? объект. Относитесь к этому так, как предлагают текущие документы Apple, поэтому добавьте что-то вроде:

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

И ваш код должен компилироваться. Возможно, было бы неплохо следить за этой структурой, поскольку выходит больше итераций бета-версии.

Удачи!

person g_blott    schedule 11.08.2015

Хотя ответ от 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")
    }
person Kane Cheshire    schedule 04.07.2018