Es scheint, dass Swift aus irgendeinem Grund beschlossen hat, die Codierung darin weniger lesbar zu machen, indem Benutzer gezwungen werden, die Parameterbezeichnungen für den Abschluss-Handler zu entfernen. Ich habe die Swift-Diskussion gelesen und denke immer noch, dass es ein Fehler ist. Zumindest hätten sie es optional machen können.
Gibt es beim Erstellen mit Xcode 8 eine Möglichkeit, den Compiler zur Verwendung von Swift 2.3 zu zwingen, damit ich diese Fehler nicht mehr erhalte? Ich habe die Option zur Verwendung von Legacy-Swift (unter Build-Einstellungen) aktualisiert, aber es scheint immer noch, dass folgende Fehlermeldung angezeigt wird:
Funktionstypen dürfen keine Argumentbezeichnung 'isloggedIn' haben. Verwenden Sie stattdessen '_'
Wie kann ich meine Etiketten in meinen Fertigstellungshandlern behalten?
quelle
Antworten:
Die Swift-Designer haben beschlossen, Argumentbezeichnungen für Funktionstypen zu verbieten.
Die Argumentation wird hier erklärt: https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
Dies ist eine frustrierende und fragwürdige Entscheidung, da das Verbot von Argumentbezeichnungen das falsche Aufrufen von Schließungen erheblich erleichtert, was wichtiger erscheint als die Vereinfachung des Typensystems der Sprache.
Benutzerfreundlichkeit> Ideologie.
quelle
Eine zu berücksichtigende Problemumgehung. Sie können nicht tun:
func doStuff(completion: (foo: Int, bar: String) -> Void) { ... completion(foo: 0, bar: "") }
... aber du kannst:
func doStuff(completion: ((foo: Int, bar: String)) -> Void) { ... completion((foo: 0, bar: "")) }
Das heißt, Sie haben ein einziges unbenanntes Argument für Ihre Schließung, das in diesem Fall ein Tupel ist
(foo: Int, bar: String)
.Es ist auf seine Weise hässlich, aber zumindest behalten Sie die Argumentbezeichnungen bei.
quelle
(((imgData imgData: Data?, _ err: MYGR8TErrorClass?)) -> Void)
sollte sein(((imgData: Data?, err: MYGR8TErrorClass?)) -> Void)
. Sie versuchen, Ihre Tupelelemente zweimal zu beschriftenBasierend auf den obigen Informationen scheint es, dass die einzige Möglichkeit, dies wirklich zu beheben und sicherzustellen, dass sein Leistungsträger darin besteht, einen Vorschlag zu unterbreiten, Argumentbeschriftungen optional zu machen, um:
completionhandler: (newvalues, nil)
sieht weniger aus wie das verwaltete Element alscompletionhandler(results: newValue, error:nil)
Bearbeiten: Ich habe den Pitch hier eingereicht: https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html, der anscheinend vereinbart wurde. Es sieht so aus, als würde es passieren, aber es wird diskutiert, ob dies als Swift 4-Verbesserung eingereicht wird (sehr wahrscheinlich).
quelle
Sie müssen _ verwenden, um Ihre Parameter unbenannt zu machen, und das ist bedauerlich. Anstatt _ an jeden Parameter anzuheften und dann blind Ihre Funktion aufzurufen, würde ich vorschlagen, ein Wrapper-Objekt zu erstellen.
Da der Verlust benannter Parameter für Funktionstypen ein höheres Risiko birgt, dass Sie die Funktion mit den falschen Werten aufrufen, würde ich empfehlen, die Parameter in eine Struktur zu packen und dies als einzigen Parameter für Ihre Funktion zu verwenden.
Auf diese Weise werden die Felder Ihrer Struktur benannt, und es gibt nur einen Werttyp, der an Ihre Funktion übergeben werden kann. Es ist umständlicher, als wenn wir die Parameter der Funktion benennen könnten, aber wir können nicht. Zumindest auf diese Weise sind Sie sicherer und fühlen sich weniger schmutzig.
struct LineNoteCellState { var lineNoteText: String? var printOnInvoice = false var printOnLabel = false }
Hier ist ein Beispiel dafür:
cell.configure(editCallback: { (_ state: LineNoteCellState) in self.lineNoteText = state.lineNoteText self.printOnInvoice = state.printOnInvoice self.printOnLabel = state.printOnLabel })
quelle
Semi-Workaround, beachten Sie das _
completion: (_ success: Bool) -> Void
quelle