2015-03-09 14 views
7

Ich verstehe, dieser besondere Fehler wurde bereits hier und da veröffentlicht und der Code ist etwas einfach, aber ich selbst noch nicht in der Lage, dies herauszufinden & Ich brauche einen Rat.'PFObject' hat kein Mitglied mit dem Namen 'tiefgestellt'

Die Sache ist, wenn ich die ersten beiden Zeilen von code provided on parse.com for saving objects

var gameScore = PFObject(className:"GameScore") 
gameScore["score"] = 1337 

füge ich die folgende Fehlermeldung für die zweite Zeile erhalten:

‚PFObject‘ hat kein Mitglied namens ‚Index '

ich bin auf Xcode 6.3 beta 2. Alle erforderlichen Bibliotheken sind mit binär verknüpft, <Parse/Parse.h> über BridgeHeader importiert.

Welche Syntax sollte ich verwenden?

Antwort

10

Dies geschieht aufgrund der 1.6.4-Version des Parse-SDK, die Objective-C-NULL-Annotationen zum Framework hinzugefügt hat. Insbesondere Parse/PFObject.h die Datei definiert:

- (PF_NULLABLE_S id)objectForKeyedSubscript:(NSString *)key;

die die Swift kompilieren Fehler verursacht. Das Entfernen des PF_NULLABLE_S behebt das Problem.

Auf der anderen Seite scheint es richtig, dass ein Objekt für einen Schlüssel Index nil sein könnte, so dass ich vermute, dies ist ein Swift Bug ...

+0

Was meinen Sie mit "PF_NULLABLE_S" entfernen? Sollte ich sagen, Kommentar '- (PF_NULLABLE_S id) objectForKeyedSubscript: (NSString *) Schlüssel;' line out? –

+3

Ich meine, ändern Sie es in 'PFObject.h' zu: ' '' - (ID) objectForKeyedSubscript: (NSString *) Schlüssel; '' ' – kashif

+0

Vielen Dank, lieber Herr –

1

Ich habe Ihren genauen Code erfolgreich ausgeführt.

Erstens, stellen Sie sicher, dass Sie in der Tat sind das Objekt im Hintergrund zu speichern, nachdem Sie setzen den neuen Wert:

gameScore.save() 

Ich doppelt für Rechtschreibfehler in dem Klassennamen überprüfen würde und Unterklasse; Wenn sie falsch sind, wird es nicht funktionieren.

Wenn das nicht das Problem ist, überprüfen Sie in Parse, dass die Unterklasse "score" auf eine Zahl festgelegt ist. Wenn Sie es versehentlich als Zeichenfolge festlegen, funktioniert das nicht als Ganzzahl.

Wenn diese Vorschläge die Lösung nicht getroffen haben, dann bin ich nicht sicher, was das Problem ist. Hoffe, ich habe geholfen.

+0

Dank für die Beantwortung. Nein, sie sind die einzigen zwei Zeilen, die ich geschrieben habe. Also versuche ich nicht, etwas zu retten, noch habe ich die Gelegenheit, etwas falsch zu schreiben. Und ich bekomme genau den gleichen Fehler mit 'gameScore [ "player"] = "Sean Plott"' & 'gameScore [ "cheatMode"] = false'. –

6

Das Problem scheint die veränderte Methode Signatur zu sein, wie kashif vorgeschlagen . Swift scheint nicht in der Lage zu sein, die Objective-C-Methode zu überbrücken, da die Signatur nicht mehr mit den Namen der tiefgestellten Methoden übereinstimmt.

Problemumgehung 1

Sie können direkt durch den Aufruf der Index-Methode ohne Änderung der Rahmen dieses Problem umgehen, anstatt die [] Betreiber:

Anstelle der Anweisung unten, um den Wert bekommen eines bestimmten Schlüssel:

let str = user["key-name"] as? Bool 

Bitte benutzen t er folgende Anweisung:

let str = user.objectForKey("key-name") as? Bool 

und

Statt der Anweisung unter der Verwendung von für den Wert eines bestimmten Schlüsseleinstellung:

user["key-name"] = "Bla bla" 

Bitte verwenden Sie die folgende Anweisung:

user.setObject("Bla bla", forKey: "key-name") 

Problemumgehung 2

Eine andere Lösung ist eine Erweiterung auf PFObject hinzuzufügen, die das subscript Mitglied implementiert und ruft setValue:forKey::

extension PFObject { 
    subscript(index: String) -> AnyObject? { 
    get { 
     return self.valueForKey(index) 
    } 
    set(newValue) { 
     if let newValue: AnyObject = newValue { 
     self.setValue(newValue, forKey: index) 
     } 
    } 
    } 
} 

Beachten Sie, dass diese zweite Problemumgehung nicht ganz sicher ist, da ich Ich bin nicht sicher, wie Parse tatsächlich die tiefgestellten Methoden implementiert (vielleicht tun sie mehr als nur setValue:forKey aufrufen - es hat in meinen einfachen Testfällen funktioniert, so scheint es eine gültige Problemumgehung, bis dies in Parse/Swift behoben wird.

+0

Dank für Ihre Antwort danken. Eine andere Problemumgehung ist, einfach mit der stabilen Version von Xcode zu gehen, bis 6.3 obligatorisch ist. In der Tat benutze ich jetzt 6.2 als meine Haupt-IDE & 6.3 Beta für die Anpassung der stabileren Projekte von mir an Swift 1.2. In Bezug auf '.setObject' habe ich bereits meinen Code mit ihm zu der Zeit wurde die Behandlung ich diese Diskussion geschaffen, aber ich wollte in Swift 1.2, um sicherzustellen,' [] 'Betreiber nicht mehr funktionieren. –

0

Ich fand einen ähnlichen Fehler mit Parse 1.6.4 und 1.6.5 in der PFConstants.h-Header-Datei mit Methodenparameter.

Xcode 6.3 Beta 4 hat einen Hinweis im Abschnitt "Neu in ..." in Bezug auf NULL-Operatoren.

Das Verschieben des Nullwertoperators zwischen dem Zeigeroperator und dem Variablennamen scheint zu entsprechen/zu kompilieren.

ändern:

PF_NULLABLE_S NSError *error 

zu:

NSError * PF_NULLABLE_S error 

    (i.e., NSError* __nullable error) 

... beschlossen, den Compiler-Fehler.

Dies funktionierte auch für Blockparameter, die mit ID definiert wurden. Damit...

PF_NULLABLE_S id object 

wird:

id PF_NULLABLE_S object 

Im obigen Fall vielleicht:

- (id PF_NULLABLE_S)objectForKeyedSubscript:(NSString *)key; 

das heißt, die NULL-Zulässigkeit Bediener nach dem Zeiger-Typ ist.

0

Ich weiß, es ist schon eine Weile, aber ich stieß auf ein ähnliches Problem, wenn ich mit SDK Version 1.9.1 meine erste Parse-Anwendung wurde gestartet wird.

Die Kurzanleitung hatte den Code unten als Beispiel dafür, wie Werte zu speichern:

let testObject = PFObject(className: "TestObject") 
testObject["foo"] = "bar" 
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in 
    println("Object has been saved.") 
} 

Aber die Linie testObject["foo"] = "bar"'PFObject' does not have a member named 'subscript' die Fehler zurückgegeben. Ich konnte das Problem umgehen, indem ich die Zeile zu testObject.setValue("bar", forKey: "foo") änderte. (Wie durch ein Tutorial-Video auf YouTube vorgeschlagen: https://www.youtube.com/watch?v=Q6kTw_cK3zY)

Verwandte Themen