Firebase Swift 3 Database stürzt bei setValue withCompletionBlock ab

8

Ich verwende Firebase auf iOS mit Swift 3.

Wenn ich

benutze %Vor%

Die App stürzt zur Laufzeit mit dem folgenden Protokoll ab:

  

*** Beenden der App aufgrund der nicht abgefangenen Ausnahme 'InvalidFirebaseData', Grund: '(nodeFrom: priority :) Objekt des Typs _SwiftValue kann nicht gespeichert werden   beim . Kann nur Objekte des Typs NSNumber, NSString, NSDictionary,   und NSArray. "

Ich habe versucht, die gleiche Funktion zu verwenden, aber ohne die abschließende Schließung und aus irgendeinem Grund funktioniert es!

%Vor%

Gibt es etwas Besonderes an Trailing Closures und Swift 3?

    
Emad Toukan 31.12.2016, 07:58
quelle

2 Antworten

7

tl; dr: Firebase stellt ein setValue(_ value: Any?, andPriority priority: Any?) bereit, das bei Verwendung eines abschließenden Abschlusses mit setValue(_ value: Any?, withCompletionBlock: (Error?, FIRDatabaseReference) -> Void) nicht korrekt übereinstimmt.

Lösung : Verwenden Sie bei Verwendung einer API mit vielen Varianten keine abschließenden Verschlüsse. In diesem Fall bevorzugen Sie setValue(myValue, withCompletionBlock: { (error, dbref) in /* ... */ }) ; Verwenden Sie nicht setValue(myValue) { (error, dbref) in /* ... */ } .

Erläuterung

Dies scheint ein Swift-Bug zu sein. Wie in anderen Sprachen, wie Java, wählt Swift im Allgemeinen die spezifischste Überladung. Z. B.

%Vor%

Wenn jedoch überladene Funktionen einem abschließenden Abschluss entsprechen, wählt Swift (zumindest manchmal) den allgemeineren Typ. Z. B.

%Vor%

Any? ist ein allgemeinerer Typ als () -> Void - d. h. "alles, sogar null" ist breiter als "eine Funktion, die 0 Parameter empfängt und etwas vom Typ Void " zurückgibt. Der abschließende Abschluss entspricht jedoch Any? ; Dies ist das Gegenteil von dem, was Sie von einer Sprache erwarten würden, die dem spezifischsten Typ entspricht.

    
mdittmer 31.12.2016, 08:02
quelle
-3
___ tag123ios ___ iOS ist das mobile Betriebssystem, das auf dem Apple iPhone, iPod touch und iPad ausgeführt wird. Verwenden Sie dieses Tag [ios] für Fragen zur Programmierung auf der iOS-Plattform. Verwenden Sie die verwandten Tags [objective-c] und [swift] für Probleme, die für diese Programmiersprachen spezifisch sind. ___ answer414093338 ___

Obwohl es eine akzeptierte Antwort gibt, die einige Klarheit liefert, erklären wir, dass es sich um einen Swift-Fehler handelt, der nicht wirklich korrekt ist. Abgesehen davon ist die Erklärung zutreffend, aber nicht für dieses Problem.

Das Hinzufügen des Abschlusses zu setValue an erster Stelle ist der eigentliche Fehler.

Eine genauere Antwort ist, dass für die setValue-Funktion kein Abschlussblock / Abschluss existiert, weshalb sie fehlschlägt.

Die spezifische Funktion -setValue: hat KEINE Schließung, weshalb sie abstürzt. Das ist eine falsche Implementierung in Ihrem Code. Pro Dokumente:

%Vor%

Beachten Sie, dass die setValue-Funktion KEINE Schließung hat und wenn Sie eine hinzufügen, wird die Funktion keine Ahnung haben, was mit diesen Daten zu tun ist.

Um einen Abschlussblock / Abschluss zu verwenden, müssen Sie die richtige Funktion aufrufen, die

ist %Vor%

Unterer Punkt ist, dass Sie einen Parameter oder Aufruf nicht zufällig zu einer Funktion hinzufügen können, die nicht dafür ausgelegt ist.

Dies ist offensichtlich nicht gültig, aber konzeptionell ist es der gleiche Fehler.

%Vor%

In diesem Fall weiß der Compiler, dass die Funktion string.append keine Option zum Schließen hat und sie vor dem Kompilieren abfängt.

Also gehen Sie noch einen Schritt weiter, dieser Code entspricht & amp; Läuft aber erzeugt auch einen Fehler

%Vor%

Auch hier hat setValue keine Schließung, daher ist dieser Code falsch implementiert.

Um zu klären, gegeben eine Klasse

%Vor%

Beachten Sie, dass setValue: aString eine völlig andere Funktion als setValue ist: aString: someCompletionHandler

Der einzige Parameter, der auf setValue basieren kann: aString ist ein String als erster und einziger Parameter.

Der setValue: aString: someCompletionHandler wird zwei Parameter übergeben, ein String an der ersten Position und ein completionHandler an der zweiten Position.

Der tatsächliche Vervollständigungsblock ist der zweite übergebene Parameter.

param1, param2 ------, --------------- string, completionBlock

Deshalb

%Vor%

ist falsch formatiert, während

%Vor%

ist richtig formatiert.

    
___ tag123firebase ___ Firebase ist eine serverlose Plattform für die einheitliche Entwicklung von Anwendungen für mobile Geräte und für das Web. ___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ qstnhdr ___ Firebase Swift 3 Database stürzt bei setValue withCompletionBlock ab ___ tag123swift3 ___ Verwenden Sie dieses Tag nur für Fragen, die sich direkt auf Änderungen in Version 3 der Apple Swift-Programmiersprache beziehen. Verwenden Sie das Tag [swift] für allgemeinere Sprachfragen oder die Tags [ios], [cocoa], [apple-watch] usw. für Fragen zur Entwicklung auf Apple-Plattformen. ___ tag123firebasedatabase ___ Firebase Realtime Database ist eine Cloud-gehostete NoSQL-JSON-Datenbank, die Offline-Caching und -Synchronisierung ermöglicht. Verwenden Sie dieses Tag NICHT für Fragen zu Cloud Firestore. Verwenden Sie stattdessen [tag: google-cloud-firestore]. ___ answer41406595 ___

tl; dr: Firebase stellt ein %code% bereit, das bei Verwendung eines abschließenden Abschlusses mit %code% nicht korrekt übereinstimmt.

Lösung : Verwenden Sie bei Verwendung einer API mit vielen Varianten keine abschließenden Verschlüsse. In diesem Fall bevorzugen Sie %code% ; Verwenden Sie nicht %code% .

Erläuterung

Dies scheint ein Swift-Bug zu sein. Wie in anderen Sprachen, wie Java, wählt Swift im Allgemeinen die spezifischste Überladung. Z. B.

%Vor%

Wenn jedoch überladene Funktionen einem abschließenden Abschluss entsprechen, wählt Swift (zumindest manchmal) den allgemeineren Typ. Z. B.

%Vor%

%code% ist ein allgemeinerer Typ als %code% - d. h. "alles, sogar null" ist breiter als "eine Funktion, die 0 Parameter empfängt und etwas vom Typ %code% " zurückgibt. Der abschließende Abschluss entspricht jedoch %code% ; Dies ist das Gegenteil von dem, was Sie von einer Sprache erwarten würden, die dem spezifischsten Typ entspricht.

    
___ qstntxt ___

Ich verwende Firebase auf iOS mit Swift 3.

Wenn ich

benutze %Vor%

Die App stürzt zur Laufzeit mit dem folgenden Protokoll ab:

  

*** Beenden der App aufgrund der nicht abgefangenen Ausnahme 'InvalidFirebaseData', Grund: '(nodeFrom: priority :) Objekt des Typs _SwiftValue kann nicht gespeichert werden   beim . Kann nur Objekte des Typs NSNumber, NSString, NSDictionary,   und NSArray. "

Ich habe versucht, die gleiche Funktion zu verwenden, aber ohne die abschließende Schließung und aus irgendeinem Grund funktioniert es!

%Vor%

Gibt es etwas Besonderes an Trailing Closures und Swift 3?

    
___
Jay 31.12.2016 14:59
quelle