2015-10-08 8 views
6

Sono molto nuovo per iOS, passando dallo sviluppo Android.Serializzazione di una classe Swift in JSON utilizzando la libreria J2ObjC e GSON

Abbiamo un'applicazione Android che ha diverse librerie che stiamo usando J2ObjC di tradurre in Objective C.

Sono stato a poco a poco portando oltre le librerie e così qui, tutto bene.

Tuttavia, dopo traducendo biblioteca GSON di Google Ho un problema per cui se provo e utilizzare il metodo tradotto toJsonWithId mi imbatto in problemi:

let gson = ComGoogleGsonGson() 
    let swiftTest = GsonSwiftTest() 
    swiftTest.name = "Ricky" 
    print(gson.toJsonWithId(swiftTest)) 

ricevo il seguente errore:

libc++abi.dylib: terminating with uncaught exception of type JavaLangAssertionError

Inoltre mostra:

Terminating app due to uncaught exception 'JavaLangAssertionError', reason: 'unknown Java type encoding'

La mia classe Swift è:

import Foundation 

@objc 
public class GsonSwiftTest : NSObject { 

    var name:String? 

} 

Se io invece uso una classe Objective C nel mio progetto Swift, aggiungo all'intestazione bridging e utilizzare la classe C Obiettivo funziona benissimo.

Credo che questo sia un malinteso da parte mia, ma non riesco a trovare la risposta sul perché questo non funzionerà. Il controllo del codice sorgente di J2ObjC mostra che l'errore viene generato quando non è possibile trovare il tipo di classe.

Se qualcuno potrebbe aiutare a spiegare le ragioni di questo problema, sarebbe apprezzato.

Grazie!

risposta

4

C'è un modo molto più semplice per serializzare istanze Swift: utilizzare direttamente la classe Foundation NSJSONSerialization. Ecco un post sul blog pertinente: JSON Serialization in Swift.

Il motivo per cui il test non riesce in Swift è che non tutte le classi Swift estendono NSObject, che j2objc esegue in java.lang.Object. Tutti i framework di serializzazione Java presuppongono/richiedono che tutte le classi estendano Object, come fanno in Java.

Per un'API multipiattaforma, è consigliabile creare un'interfaccia serialize/unserialize semplice, quindi implementarla una volta per Android utilizzando GSON e una volta in modo nativo con NSJSONSerialization. Swift si sta evolvendo rapidamente, quindi se diventa disponibile un meccanismo di serializzazione migliore, il tuo progetto può facilmente trarne vantaggio senza intaccare la porta Android.

+1

Grazie Tom, ero a conoscenza di NSJSONSerialization, volevo solo capire il ragionamento per l'errore, che ora hai spiegato. Grazie per il tuo duro lavoro in biblioteca. – Ricky

Problemi correlati