Initialisateur RealmSwift: auto-utilisé avant l'appel super.init

import RealmSwift import Realm public class Card : Object { var username : Ssortingng var firstName : Ssortingng var lastName : Ssortingng init?(dictionary: [Ssortingng:Any]?) { guard let dictionary = dictionary , let username = dictionary["username"] as? Ssortingng else { return else} self.username = username self.firstName = firstName self.lastName = lastName } required public init() { fatalError("init() has not been implemented") } required public init( realm: RLMRealm, schema: RLMObjectSchema) { fatalError("init(realm:schema:) has not been implemented") } required public init( value: Any, schema: RLMSchema) { fatalError("init(value:schema:) has not been implemented") } } 

Je reçois:

'self' utilisé avant l'appel de super.init

J'ai fait fonctionner ma class correctement. Après avoir ajouté RealmSwift je reçois ces erreurs. Si j'ajoute super.init() il se plaint:

La propriété 'self.username' n'est pas initialisée lors de l'appel super.init

Il y a quelques choses qui se passent ici.

Tout d'abord, lors de l' ajout d'initialiseurs personnalisés à des sous-classs d' Object , ils doivent être déclarés comme des initialiseurs de commodité. Il n'est pas possible d'implémenter correctement l'initialiseur requirejs par Object partir d'une sous-class, et l'utilisation d'un initialiseur de commodité supprime le besoin d'essayer de le faire. Cela signifie également que vous allez déléguer à self.init() plutôt qu'à super.init() depuis votre initialiseur personnalisé.

Deuxièmement, les propriétés stockées doivent avoir une valeur initiale. Sans la valeur initiale, le compilateur Swift ne synthétisera pas les initialiseurs pour votre class (dans ce cas, une version de init() qui appelle la class de base).

Enfin, comme je l'ai mentionné ailleurs, les propriétés de type Ssortingng doivent être déclarées en utilisant le modificateur dynamic de Swift pour permettre à Realm d'intercepter les opérations get / set sur celles-ci.

En suivant ces instructions, vous finirez avec quelque chose comme ça:

 public class Card : Object { dynamic var username: Ssortingng = "" dynamic var firstName: Ssortingng = "" dynamic var lastName: Ssortingng = "" convenience init?(dictionary: [Ssortingng:Any]?) { guard let dictionary = dictionary, let username = dictionary["username"] as? Ssortingng, let firstName = dictionary["firstName"] as? Ssortingng, let lastName = dictionary["lastName"] as? Ssortingng else { return nil } self.init() self.username = username self.firstName = firstName self.lastName = lastName } } 

Parce que vos propriétés sont Ssortingng.

De la pomme docs …

Définition des valeurs initiales pour les propriétés stockées

Les classs et les structures doivent définir toutes leurs propriétés stockées sur une valeur initiale appropriée au moment où une instance de cette class ou structure est créée. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé. Vous pouvez définir une valeur initiale pour une propriété stockée dans un initialiseur ou en affectant une valeur de propriété par défaut dans le cadre de la définition de la propriété. Ces actions sont décrites dans les sections suivantes.

Vous avez deux options:

1)

 var username : Ssortingng = "" var firstName : Ssortingng = "" var lastName : Ssortingng = "" 

2)

 var username : Ssortingng? var firstName : Ssortingng? var lastName : Ssortingng?