2016-04-24 5 views
6

Ich kann Realm nicht arbeiten, wenn ich Initialisierer für eine Klasse bereitstellen möchte, schlägt Xcode endlos Fehler vor.RealmSwift Initialisierer - Xcode fix-it hält es falsch

habe ich beschlossen, zwei Screenshots statt Code-Schnipsel laden es einfacher zu machen Fehler

enter image description here

ich die Vorschlägen folgen, um zu sehen und mit diesem

enter image description here

den letzten Ende Fehler sagt "Verwendung von nicht deklarierten Typ 'RLMObjectSchema'

Ich benutze die neueste Version 0.99 von RealmSwift

Antwort

10

Der empfohlene Weg element Bequemlichkeit initializer schafft, wie die folgenden:

class Item: Object { 
    dynamic var isBook: Bool = true 
    dynamic var numberOfPages: Double = 0 
    dynamic var isInForeignLanguage: Bool = true 
    dynamic var isFictional: Bool = true 
    dynamic var value: Int { 
     get { 
      return calculalatedValue() 
     } 
    } 

    convenience init(isBook: Bool, numberOfPages: Double, isInForeignLanguage: Bool, isFictional: Bool) { 
     self.init() 
     self.isBook = isBook 
     self.numberOfPages = numberOfPages 
     self.isInForeignLanguage = isInForeignLanguage 
     self.isFictional = isFictional 
    } 

    ... 
} 

Sie nicht Standardinitialisierung weglassen können, weil Realm benötigt einen Standardinitialisierer zum Instanziieren von Objekten für die Abfrage. Bei der Abfrage im Realm ruft Realm intern den Standardinitialisierer auf, um die Objekte zu instanziieren.

Sie können auch den Standardinitialisierer überschreiben, aber wir empfehlen es nicht. Wenn Sie den Standardinitialisierer überschreiben, sollten Sie andere erforderliche Initialisierer außer Kraft setzen, die aufgrund der Swift-Systembeschränkung vom ObjC-Layer geerbt wurden. Außerdem sollten Sie sowohl Realm als auch RealmSwift Frameworks importieren. Weil in den Parametern dieser Initialisierer nur Objective-C-Klassen vorhanden sind.

import RealmSwift 
import Realm // Need to add import if you override default initializer! 

class Item: Object { 
    dynamic var isBook: Bool = true 
    dynamic var numberOfPages: Double = 0 
    dynamic var isInForeignLanguage: Bool = true 
    dynamic var isFictional: Bool = true 
    dynamic var value: Int { 
     get { 
      return calculalatedValue() 
     } 
    } 

    required init() { 
     super.init() 
    } 

    required init(realm: RLMRealm, schema: RLMObjectSchema) { 
     super.init(realm: realm, schema: schema) 
    } 

    required init(value: AnyObject, schema: RLMSchema) { 
     super.init(value: value, schema: schema) 
    } 
+0

Dank viel! Daher ist der erste Code-Snippet der empfohlene Weg zur Initialisierung. Erste Standardinitialisierer kommen ins Spiel, gefolgt von Convenience init, oder? – DCDC

+1

Ja. Die empfohlene Methode zur Initialisierung ist das erste Code-Snippet. und Erste Standardinitialisierer kommen ins Spiel, gefolgt von comfort init. –

1

Versuchen:

required convenience init(...) { 
    self.init() 
    ... 
} 

Siehe https://github.com/realm/realm-cocoa/issues/1849

+0

Yup das funktioniert, aber ist es eine Möglichkeit, Einführung von defalut initializers wegzulassen, eq statt dynamische var isBook: Bool = true, lassen Sie einfach ohne Initialisierung var isBook: Bool – DCDC