2017-09-06 3 views
1

ich nicht herausfinden kann, was mit dem folgenden falsch ist:Was ist falsch an dieser Swift-Syntax?

fileprivate func showInlineErrorMessage(_ message: String, forField textField: UITextField) { 

     // Show error message 
     errorLabel.text = message 
     errorLabel.isHidden = false 

     // Highlight field on which the error is 
     [usernameTextField, passwordTextField, birthYearTextField, genderTextField].forEach { 
      updateHighlightOnTextField($0!, highlight: $0 === textField) 
     } 
    } 

Der spezifische Teil ist $0 === textField

Der Compiler die folgende Fehlermeldung angezeigt wird:

"?" must be followed by a call, member lookup, or a subscript 

Das ist alter Code , so scheint es, dass sich in letzter Zeit etwas geändert haben könnte.

Die aufgerufene Funktion ist

fileprivate func updateHighlightOnTextField(_ textField: UITextField, highlight: Bool) { 
     let highlightView = textField.superview! 
     highlightView.layer.borderWidth = highlight ? 1.0 : 0.0 
     highlightView.layer.borderColor = highlight ? DefaultTheme.lineColorError.cgColor : nil 
    } 

enter image description here

+2

Was ist die Signatur der 'updateHighlightOnTextField' Methode? Warum erzwingst du $ 0 als erstes Argument? Sind eines oder mehrere der Textfelder optional? Wenn das erste Argument zwangsausgepackt ist, warum ist das nicht das zweite? – rmaddy

+0

Ich habe gerade die obige Frage mit zusätzlichen Informationen aktualisiert. –

Antwort

1

Manchmal swift nicht die Art eines Inline-Anweisung verstehen kann. Haben Sie versucht:

einen externen Boolean Erstellen:

[usernameTextField, passwordTextField, birthYearTextField, genderTextField].forEach { 
     let isHighlighted: Bool = ($0 === textField) 
     updateHighlightOnTextField($0!, highlight: isHighlighted) 
    } 
+0

Danke, das ist der einzige Ansatz, den ich zur Arbeit bekommen konnte. –

1

Die unnötige Verwendung der Kraft Abwickeln das Problem verursacht zu sein scheint.

Wenn Sie ändern:

updateHighlightOnTextField($0!, highlight: $0 === textField) 

zu:

updateHighlightOnTextField($0, highlight: $0 === textField) 

dann das Problem verschwindet.

Dies setzt voraus, dass Ihre Textfeldeigenschaften entweder als nicht optional oder als implizit ausgepackte Option definiert sind.

In dem unwahrscheinlichen Fall, dass Ihre Textfelder als Optionals deklariert sind, können Sie $0 sicher auspacken, um die Verwendung von ! zu vermeiden.

+0

Dies macht keinen Unterschied, eingewickelt oder unverpackt das gleiche Problem tritt auf –

+0

Welche Version von Xcode verwenden Sie? Meine Antwort basiert auf tatsächlichen Tests in einem Swift Playground. Durch das Entfernen des '!' Wird das Problem behoben. – rmaddy

+0

Xcode Version 8.3.3. Xcode besteht auch darauf, dass $ 0 mit '!' Ausgepackt wird, da dies Optionals sind –

Verwandte Themen