2017-06-27 1 views
0

Ich habe eine Klasse namens ObjectManager, die generischen Typ O: Object, Persistable hat. Auf diese Weise kann ich eine Klasse haben, die mit mehreren verschiedenen Unterklassen des Realms Object arbeiten kann. Aber das Problem ist in der letzten Zeile cache = O(message: "hello world") der Fehler ist: Falsche Argument Label-Aufruf (hat ‚Nachricht:‘ erwartete ‚Wert:‘)Wie benutzerdefinierte Initialisierung für ein Realm-Objekt in einer Klasse mit generischem Typ verwenden?

Bei der Eingabe es mir zeigt, dass ich initializer von Persistable-Protokoll verwenden kann , aber beschweren Sie sich beim Kompilieren, dass es einen Initialisierer von Object Klasse erwartet. Ist es möglich, einen persistenten Initialisierer zu erzeugen?

protocol Persistable { 
    init(message: String) 
} 

class CustomObject: Object, Persistable { 
    dynamic var message: String = "" 
    required convenience init(message: String) { 
    self.init() 
    self.message = message 
    } 
} 

class ObjectManager<O>: NSObject where O: Object, O: Persistable { 
    var cache: O? 

    func didReceive(message: String) { 
    cache = O(message: "hello world") 
    } 
} 

Antwort

4

Wenn Sie Ihre CustomObject Klasse final machen, und ersetzen Sie Ihre initializer mit einem Factory-Methode, werden Sie Code erhalten, das tut, was Sie wollen. Unglücklicherweise sind die Fehlermeldungen des Swift-Compilers in diesem Fall so kryptisch, dass sie nicht hilfreich sind.

protocol Persistable { 
    static func factory(message: String) -> Self 
} 

final class CustomObject: Object, Persistable { 
    dynamic var message: String = "" 
    static func factory(message: String) -> CustomObject { 
     let x = CustomObject() 
     x.message = message 
     return x 
    } 
} 

class ObjectManager<O>: NSObject where O: Object, O: Persistable { 
    var cache: O? 

    func didReceive(message: String) { 
     cache = O.factory(message: "hello world") 
    } 
} 
+0

Hmm, ich weiß nicht, ob ich es richtig zu machen, aber es auf diese Weise, nicht funktioniert 'letzte Klasse CustomObject setzen: Object, Persistable { }' –

+0

Ach, hatte ich das 'O geändert: Object' Constraint zu 'O: CustomObject' und änderte es nicht zurück. In diesem Fall möchten Sie den Initialisierer durch eine statische Factory-Methode ersetzen (z. B. Protokoll persistable {static func factory (message: String) -> Self} '). Das funktioniert auch dann korrekt, wenn die Version mit den Initialisierungen fehlschlägt. – AustinZ

+1

Ok, das funktioniert, danke. Vielleicht können Sie die Antwort aktualisieren. –

Verwandte Themen