2015-02-25 7 views
5

Ich versuche, RestKit in meinem Swift-basierten Projekt zu verwenden. Ich kann Swift primitive Datentypen, wie Int, Double, Bool und so weiter nicht verwenden, außer für String, Array und Dictionaries (was vermutlich darauf zurückzuführen ist, dass sie gebührenfrei zu NSString überbrückt sind) , NSArray und NSDictionary)Verwenden von Restkit mit Swift

Mit objective-c konnte ich Eigenschaften in meinen Objekten als primitive Datentypen als Eigenschaften definieren, die zugewiesen werden. In Swift kann ich nur Objekte (String, NSNumber, Array, Dictionary) verwenden, sonst stürzt die App mit "setValue: forUndefinedKey ab: Diese Klasse ist nicht key-code-konform für den Schlüssel aBool".

Beispiel: Hier ist, wie mein Objekt wie in Objective-C aussehen:

@interface TestObject : NSObject 

@property (strong, nonatomic) NSString *aString; 
@property (assign, nonatomic) BOOL aBool; 
@property (assign, nonatomic) CGFloat aFloat; 

@end 

und die "gleichwertig" in Swift:

class TestObject:NSObject { 

    var aString:NSString? 
    var aBool:Bool? 
    var aFloat:Double? 

} 

Das Abstürze und während ich verstehe, warum es stürzt ab, ich würde gerne wissen, ob es eine andere Problemumgehung gibt, als NSNumber für Booleans, Integers und Floats zu verwenden, genauso wie es in Objective-C funktioniert?

(Wenn eine der RestKit Entwickler lesen diese: Erstmal Danke für Ihre Arbeit und dann: Gibt es Pläne bezüglich Swift Unterstützung/Hafen zum Swift)

+0

Sie sollten vollständige Ausnahmemeldungen und Stack-Traces anzeigen. Dies kann auch besser als ein Problem auf GitHub angesprochen werden. – Wain

Antwort

8

ich eine App in Swift tue, und wir begannen unsere Arbeit im Sommer 2014, als Swift ziemlich neu war. Ich begann RestKit zu verwenden, um die REST-Kommunikation mit einem Server abzuwickeln, und ich habe mindestens einen ganzen Monat damit verbracht, RestKit für meine Verwendung zu konfigurieren.

Während ich Ihren Anwendungsfall nicht kenne, habe ich es einfacher gefunden, stattdessen Alamofire und SwiftyJSON für die Arbeit zu verwenden. Es hat mir viele Stunden erspart. Es bedeutet auch, dass ich manuell die Konvertierung von dynamischen Typen zu den Typen in meinen Entitätsobjekten durchführe, aber die dafür aufgewendete Zeit ist viel kürzer als die Zeit, die ich zuvor damit verbracht habe, RestKit zu konfigurieren.

Wenn dies für Sie nicht praktikabel ist, sollten Sie sich die in RestKit verfügbaren RKValueTransformer-Klassen ansehen. In Ihrem RKObjectMapping können Sie eigene Transformatoren für einzelne Eigenschaften angeben. Aber ich denke, die Zeit ist besser mit Alamofire und SwiftyJSON verbracht. Sie sind schließlich heimische Swift-Bibliotheken.

+0

Vielen Dank für Ihre Unterstützung. –

+1

Vielen Dank, dass Sie mich ermutigt haben, RestKit für dieses schnelle Projekt fallen zu lassen. Obwohl SwiftyJSON kein exakter Ersatz für RestKit ist, ist die Art, wie RestKit funktioniert, möglicherweise nicht die Art und Weise, wie wir unsere Probleme in Swift lösen wollen.Es vereitelt irgendwie den Zweck, eine völlig neue Sprache einzuführen, wenn wir jetzt versuchen, alles von Objective-C "1" zu "übersetzen". Vielmehr sollten wir versuchen, die neuen Paradigmen zu umarmen. Alamofire (Mattt Thompson) zeigt eindrucksvoll, dass es darum geht, in Swift neue Frameworks von Grund auf zu erstellen, anstatt das entsprechende Obj-C-Framework (AFNetworking) zu aktualisieren. –

+0

Hallo @alex, glücklich, dass es ermutigend war :-) Ich stimme dir zu. –

0

Für alle, die RestKit in einem Swift-Projekt nicht löschen können, kann diese Lösung hilfreich sein.

In meinem Fall wurde die App abstürzt, weil RestKit nicht "true"/"false" Strings aus der JSON zu einer Bool Art in Swift Karte könnte.

Ich löste es Hinzufügen eines anderen String Attributs in meiner Klasse und Aktualisieren der gewünschten booleschen Wert auf seiner didSet Methode. In Ihrem Fall wäre dies:

class TestObject:NSObject { 

    var aString:NSString? 
    var aBool:Bool? 
    var aFloat:Double? 

    var aBoolString: String? { 
     didSet { 
      self.aBool = aBoolString.lowercased() == "true" 
     } 
    } 
} 

Hoffe, das hilft!