2016-09-29 1 views
0

Ich erhalte den Fehler cannot convert value for '(CKAccountStatus, NSError?) ->()' to '(CKAccountStatus, NSError?) -> Void' in der dritten Zeile der FunktionSwift 3 vorgeschlagen Korrektur für „Wert kann nicht konvertieren für '(CKAccountStatus, NSError?) ->()' in '... -> Void'.

Hier ist der Code:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    container.accountStatusWithCompletionHandler{ 
     (status: CKAccountStatus, error: NSError?) in 
     dispatch_async(dispatch_get_main_queue(), { 
      var title: String! 
      var message: String! 
      if error != nil{ 
       title = "Error" 
       message = "An error occurred = \(error)" 
      } else { 
       //title = "No errors occurred getting info" 
       switch status{ 
       case .Available: 
        message = "The user is logged in to iCloud" 
        title = "GOOD" 
        print("determined status was available") 
        self.shouldPullFromICloud() 
       //self.displayAlertWithTitle(title, message: message) 
       case .CouldNotDetermine: 
        message = "Could not determine if the user is logged" + 
        " into iCloud or not" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .NoAccount: 
        message = "User is not logged into iCloud" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .Restricted: 
        message = "Could not access user's iCloud account information" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       } 
       print(title, message) 
      } 
     }) 
    } 
} 

nun durch Einfügen „als 'fix it' Xcode bietet! (CKAccountStatus, Error?) -> Void "in der vorletzten Zeile. Das hilft nicht und es fragt mich immer, ob ich es" reparieren "will und wenn ich es anklicke, wird es immer weiter ankreuzen "wie! . (? CKAccountStatus, Error) -> Void "s Hier ist, was es sieht aus wie nach einem einzigen Klick auf die 'fix it' Button:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    container.accountStatusWithCompletionHandler{ 
     (status: CKAccountStatus, error: NSError?) in 
     dispatch_async(dispatch_get_main_queue(), { 
      var title: String! 
      var message: String! 
      if error != nil{ 
       title = "Error" 
       message = "An error occurred = \(error)" 
      } else { 
       //title = "No errors occurred getting info" 
       switch status{ 
       case .Available: 
        message = "The user is logged in to iCloud" 
        title = "GOOD" 
        print("determined status was available") 
        self.shouldPullFromICloud() 
       //self.displayAlertWithTitle(title, message: message) 
       case .CouldNotDetermine: 
        message = "Could not determine if the user is logged" + 
        " into iCloud or not" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .NoAccount: 
        message = "User is not logged into iCloud" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .Restricted: 
        message = "Could not access user's iCloud account information" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       } 
       print(title, message) 
      } 
     }) 
    } as! (CKAccountStatus, Error?) -> Void 
} 
+0

nur dieses eine ändern '(Stand: CKAccountStatus, Fehler: NSError) in' mit' (Stand: CKAccountStatus, Fehler: Fehler?) in' und entfernen 'as! (CKAccountStatus, Fehler?) -> Void' one. –

+0

Ich bekomme immer noch den sich wiederholenden Fehler und die 'fix it' – lelephant

Antwort

0

Grund für den Fehler

Dies geschah. Wenn ich mein Projekt auf swift 3.0 oder einen Cocoapod aktualisiert habe, muss ich den Methodencode kopieren und dann mit Autocomplete neu deklarieren und dann den Code wieder einfügen.Der Fehler ist ein wenig vage, aber das liegt daran, dass sich die Deklaration geändert hat.

Schnellfix

Speziell die Deklaration verwendet jetzt Fehler nicht NSError. So ändern Sie die Zeile:

(status: CKAccountStatus, error: NSError?) in 

An:

(status: CKAccountStatus, error: Error?) in 

Voll Fix (Angefordert von OP)

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    container.accountStatus{ 
     (status: CKAccountStatus, error: Error?) in 
     dispatch_async(dispatch_get_main_queue(), { 
      var title: String! 
      var message: String! 
      if error != nil{ 
       title = "Error" 
       message = "An error occurred = \(error)" 
      } else { 
       //title = "No errors occurred getting info" 
       switch status{ 
       case .Available: 
        message = "The user is logged in to iCloud" 
        title = "GOOD" 
        print("determined status was available") 
        self.shouldPullFromICloud() 
       //self.displayAlertWithTitle(title, message: message) 
       case .CouldNotDetermine: 
        message = "Could not determine if the user is logged" + 
        " into iCloud or not" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .NoAccount: 
        message = "User is not logged into iCloud" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       case .Restricted: 
        message = "Could not access user's iCloud account information" 
        title = "BAD" 
        self.noUserIsSignedIn() 
       } 
       print(title, message) 
      } 
     }) 
    } 
} 
+0

Okay, so dass der Code löste funktioniert in dem, wenn gab mir einen anderen 'Fehler' Fehler, der nach dem Klicken funktioniert! Aber jetzt ist mein Code, anstatt "accountStatusWithCompletionHandler {" ist nur "accountStatus {". Brauche ich den Beendigungshandler? Es sagt, ich könnte "accoutnStatus (completion:)" verwenden, aber ich weiß nicht, wie ich meinen Code in den Completion-Handler schreiben soll oder was er ehrlich tut – lelephant

+0

Ja, Sie brauchen noch den Competition-Handler und er ist immer noch da. Sie haben gerade die Namenskonvention geändert und den WithCompletionHandler gelöscht, um die Deklaration zu verkürzen. – torinpitchers

+0

Würde es Ihnen etwas ausmachen, mir zu zeigen, wie es aussehen würde, wenn Sie den Code innerhalb des (Completion:) - Teils des Codes platzieren würden? Ich kann es nicht zur Arbeit bringen. Würde alles in diese Klammern gehen? – lelephant

0

ersten zwei Dinge:

accountStatusWithCompletionHandler(_:) umbenannt zu accountStatus(completionHandler:) in Swift 3.

func accountStatus(completionHandler: (CKAccountStatus, Error?) -> Void)

Und wie bereits kommentiert, hat sich die Art der complete geändert:

completionHandler: @escaping (CKAccountStatus, Error?) -> Void

Wenn ein Verschluss Argument mit Verschluss Ausdruck liefert, haben Sie keine Notwendigkeit zu befürchten @escaping.

So müssen Sie diese beiden Zeilen ersetzen:

container.accountStatusWithCompletionHandler{ 
     (status: CKAccountStatus, error: NSError?) in 

Mit diesen:

container.accountStatus { 
     (status: CKAccountStatus, error: Error?) in 

können Sie viele andere Teile finden Sie oben in Swift 3, jedoch mit den beiden reparieren müssen behoben, Xcode wird Ihnen einen besseren Vorschlag geben.

(Vergessen Sie nicht as! (CKAccountStatus, Error?) -> Void zu entfernen, bevor Sie den angezeigten Code zu testen.)

+0

Muss ich nicht den (Completion:) Teil verwenden? Ich kann einfach den .accountStatus verwenden? – lelephant

+0

@lelephant, wenn Sie eine abschließende Closure-Syntax verwenden, können Sie die Parameterbezeichnung 'completionHandler:' weglassen. Wenn Sie die normale Methodenaufrufsyntax verwenden, benötigen Sie sie - 'container.accountStatus (completionHandler: {...})' '. – OOPer

+0

Können Sie erklären, was Trailing Closure-Syntax ist? Basierend auf meinem Code, der besser zu verwenden wäre? – lelephant

Verwandte Themen