2016-04-25 15 views
6

Sono stato a lungo uno sviluppatore di Objective-C e ho sentito parlare di Realm alcune settimane fa. D'altra parte ho sempre desiderato migrare a poco a poco verso Swift, così ho creato un piccolo progetto che coinvolge Realm + Swift.Swift + Realm newbie: Problemi con un oggetto Realm semplice e relativi inizializzatori

Che cosa significa? Sono un principiante di Swift + Realm.

In ogni caso, ho creato un piccolo demo/Proof of concept per un progetto che ho in mente e ho pensato che doveva essere più facile. Ma il compilatore Xcode dice diversamente.

Il mio problema è con uno degli inizializzatori dei miei oggetti.

Le mie intenzioni erano semplici, ma apparentemente il Realm ha bisogno di più inizializzatori di quanto volessi.

Il codice di uno dei miei Reame oggetti è questo:

import Foundation 

import Realm 
import RealmSwift 

class Partida: Object 
{ 
    dynamic var id_partida: String 
    dynamic var inventario: Inventory? 

    required init() 
    { 
     inventario = Inventory() 
     id_partida = "id_partida_test" 
     super.init() 
    } 



    required init(value: AnyObject, schema: RLMSchema) { 
     //fatalError("init(value:schema:) has not been implemented") 
     super.init(value: value, schema: schema) 
    } 


    required init(realm: RLMRealm, schema: RLMObjectSchema) { 
     //fatalError("init(realm:schema:) has not been implemented") 
     super.init(realm: realm, schema: schema) 
    } 

    override class func primaryKey() -> String? { 
     return "id_partida" 
    } 

} 

Il mio codice originale aveva solo la "normale" init initializer. Ma Xcode mi ha costretto a creare altri due inizializzatori aggiuntivi (valore e realm).

Se compilo il codice che ho appena incollato sopra, Xcode lamenta nei 2a e 3a inizializzatori richiesti, precisamente nella parte super.init. Dice:

Property 'self.id_partida' not initialized at super.init call 

ho capito il significato di esso, ma non so come evitare l'errore perché se rimuovere entrambe le linee super.init, il programma si blocca in fase di esecuzione.

se io rimuovere il commento le righe FatalError, che si blocca anche in fase di esecuzione.

Infatti, non voglio utilizzare questi 2 inizializzatori. Se potessi, non li aggiungerei, ma Xcode deve, a quanto pare. L'unico codice che voglio veramente aggiungere alla mia funzione init dell'oggetto è la "semplice" funzione init, che era l'unica parte del codice considerata mia.

Penso che potrei avere alcune incomprensioni concetto nel Reame + Swift + inizializzatori.

Sto anche avendo la Xcode sensazione mi sta costringendo a aggiungere il codice non ho bisogno e/o non capisco neanche.

Qualsiasi aiuto sulla comprensione degli inizializzatori "init init" in Realm sarà più che benvenuto.

Realm Ufficiale + documentazione Swift è oltre la mia conoscenza come non capisco molti dei suoi concetti, anche dopo aver riletto molte volte.

Google e StackOverflow non sono stati realmente utile questa volta ...

Grazie.

+0

È necessario solo 'convenience init' e all'interno aggiungere' self.init() ', non è necessario' required init' – Tj3n

+0

Se commento gli inizializzatori complessi "init necessari" (2nd e 3rd), XCode 7.3 lamentano non importa quale. Semplicemente non si compila. Se rimuovo la parola chiave "required" prima del semplice inizializzatore, XCode lamenta: "è necessario utilizzare la parola chiave richiesta su tutte le sostituzioni". – Isaac

+0

Si prega di controllare la risposta qui sotto, spero che ti aiuti – Tj3n

risposta

6

Gli inizializzatori in Swift si comportano in modo un po 'diverso rispetto all'Obiettivo-C, quindi posso sicuramente vedere l'angolo che stai venendo da qui.

In questo caso, però, dal momento che si sta solo utilizzando l'inizializzazione per impostare alcuni valori di default, è totalmente non necessarie dal momento che si dovrebbe essere in grado di assegnare i valori predefiniti per le proprietà stesse:

class Partida: Object 
{ 
    dynamic var id_partida = "id_partida_test" 
    dynamic var inventario: Inventory? = Inventory() 

    override class func primaryKey() -> String? { 
     return "id_partida" 
    } 

} 

Fammi sapere se non funziona ancora! :)

+0

Ha funzionato, la mia versione finale del codice è diventata davvero spogliata, come quella digitata :) Comunque, ho paura di Non appena avrò bisogno di ulteriori risorse di inizializzazione, o se i miei oggetti diventeranno più complessi (lo faranno), avrò bisogno di ulteriore aiuto per questo argomento inaspettato e difficile in futuro. Grazie – Isaac

3

perché ha già init() in Object di classe, si utilizza sottoclasse di Object, quindi si dispone già di suo init in oggetto Reame, si dovrebbe dare il vostro valore init var, come dynamic var id_partida: String = "id_partida_test", e quindi se si chiama let test = Partida() ha già il vostro 2 valore init, altri init deve essere contrassegnato con la convenienza

Quando si salva l'oggetto per memorizzare persistente, dovrebbe essere avere sempre valore, è possibile utilizzare regno di optional quindi necessario leggere la documentazione

Ecco il mio regno campione classe in modo che tu abbia avuto l'idea:

import Foundation 
import RealmSwift 
import SwiftyJSON 

class ProjectModel: Object { 
    dynamic var id: Int = 0 
    dynamic var name: String = "" 

    //Dont need this, call init() already have value 
    required init() { 
     id = 0 
     name = "" 
     super.init() 
    } 

    convenience init(fromJson json: JSON!){ 
     self.init() 

     if json == nil { 
      return 
     } 

     id = json["id"].intValue 
     name = json["name"].stringValue 
    } 

    override class func primaryKey() -> String? { 
     return "id" 
    } 
} 
+0

Ho adattato parti del tuo codice sul mio. Ora il compilatore XCode non mi obbliga ad avere inizializzatori complessi "richiesti init", ma avendo self.init() all'interno della convenienza richiesta init() crea un ciclo infinito di inizializzatori (come mi aspettavo prima di eseguire l'esempio) e si blocca in runtime. Non ho il punto di chiamare self.init() dentro init() ... – Isaac

+0

Non penso che tu abbia bisogno di init :) quindi dovresti rimuoverlo e dare il valore di partenza della variabile, e usare init convenienza se vuoi per creare supporter init – Tj3n

+0

Ok, no Inits quindi, ora compila. Ora devo assegnare i miei valori iniziali di init nella dichiarazione var (nessun problema). A quanto pare non si verificano nemmeno arresti anomali, quindi devo controllare se le proprietà dell'oggetto realm vengono memorizzate, mantenute, ecc. Ho la sensazione che non lo ottenga al 100% perché funziona ora. Grazie comunque ... – Isaac