1
votes

La classe n'a pas d'erreur d'initialisation Realm Class Swift

Je reçois une classe n'a pas d'erreur d'initialisation. N'est-ce pas ainsi que j'organiserais la classe. Ceci est pour une base de données Realm OBject, les propriétés que je souhaite stocker. Je suis nouveau dans Swift and Realm, mais j'ai pensé que c'était ainsi que cela se ferait. Si je supprime la fonction init () et que j'attribue simplement toutes les valeurs, cela fonctionne, mais des propriétés comme justTook et tout ce que je ne veux pas commencer par une valeur, je dois la définir plus tard dans le programme.

Voici mon code:

class MedInfo: Object {
    //  Info To Be Stored
    @objc dynamic var keyID = UUID().uuidString
    @objc dynamic var medName: String
    @objc dynamic var medDose: String
    @objc dynamic var currentDate: Date
    @objc dynamic var timeTook: Date
    @objc dynamic var lastTook: Date
    @objc dynamic var durationOfTime: Date
    @objc dynamic var doctorName: String
    @objc dynamic var rxDate: Date
    @objc dynamic var medInfo: String
    @objc dynamic var pictureOfMed: UIImage

    override static func primaryKey() -> String? {
        return "keyID"
    }

    convenience init(medName: String, medDose: String, currentDate: Date, timeTook: Date, lastTook: Date, durationOfTime: Date, doctorName: String,rxDate: Date, medInfo: String, pictureOfMed: UIImage) {
        self.medName = medName
        self.medDose = medDose
        self.currentDate = currentDate
        self.timeTook = timeTook
        self.lastTook = lastTook
        self.durationOfTime = durationOfTime
        self.doctorName = doctorName
        self.rxDate = rxDate
        self.medInfo = medInfo
        self.pictureOfMed = pictureOfMed
    }


1 commentaires

vous pouvez déclarer des variables comme optionnelles si vous ne voulez pas leur donner de valeur lors de l'initialisation.


3 Réponses :


0
votes

Vous devez appeler init pour créer l'instance.

convenience init(medName: String, medDose: String, currentDate: Date, timeTook: Date, lastTook: Date, durationOfTime: Date, doctorName: String,rxDate: Date, medInfo: String, pictureOfMed: UIImage) {

    self.init() 

    self.medName = medName
    self.medDose = medDose
    self.currentDate = currentDate
    self.timeTook = timeTook
    self.lastTook = lastTook
    self.durationOfTime = durationOfTime
    self.doctorName = doctorName
    self.rxDate = rxDate
    self.medInfo = medInfo
    self.pictureOfMed = pictureOfMed
}


0 commentaires

2
votes

Vous devez définir des valeurs par défaut pour tous les paramètres, comme décrit vaguement dans la documentation. De ici :

Lorsque vous utilisez Realm depuis Swift, la fonction Swift.reflect (_ :) est utilisée pour déterminer les informations sur vos modèles, ce qui nécessite cet appel init () réussit. Cela signifie que toutes les propriétés non facultatives doivent avoir une valeur par défaut.

Tous les exemples le montrent, alors suivez-les. Votre classe doit donc être déclarée:

class MedInfo: Object {
    //  Info To Be Stored
    @objc dynamic var keyID = UUID().uuidString
    @objc dynamic var medName: String = ""
    @objc dynamic var medDose: String = ""
    @objc dynamic var currentDate: Date = Date()
    @objc dynamic var timeTook: Date = Date()
    @objc dynamic var lastTook: Date = Date()
    @objc dynamic var durationOfTime: Date = Date()
    @objc dynamic var doctorName: String = ""
    @objc dynamic var rxDate: Date = Date()
    @objc dynamic var medInfo: String = ""

    // UIImage not supported, you'll need to store a URL/filename or something else
    @objc dynamic var pictureOfMed: UIImage


0 commentaires

0
votes

Comme @ces l'a déjà correctement cité dans la documentation de Realm: " Cela signifie que toutes les propriétés non facultatives doivent avoir une valeur par défaut. "

C'est pourquoi je pense que c'est le meilleur moyen pour vous pour créer votre objet Realm, vous devez déclarer vos variables comme des options.

De cette façon, vous n'aurez pas à appeler init. C'est la façon dont je crée mes propres objets Realm et la façon dont j'ai vu la plupart des gens les créer.

Donc, votre objet ressemblerait à ceci:

class MedInfo: Object {
//  Info To Be Stored
@objc dynamic var keyID = UUID().uuidString
@objc dynamic var medName: String?
@objc dynamic var medDose: String?
@objc dynamic var currentDate: Date?
@objc dynamic var timeTook: Date?
@objc dynamic var lastTook: Date?
@objc dynamic var durationOfTime: Date?
@objc dynamic var doctorName: String?
@objc dynamic var rxDate: Date?
@objc dynamic var medInfo: String?
@objc dynamic var pictureOfMed: UIImage?

override static func primaryKey() -> String? {
    return "keyID"
}


2 commentaires

Vous pouvez en effet faire cela. Mais en rendant vos propriétés de modèle facultatives, vos propriétés de modèle sont désormais facultatives . Oui, je sais ce que j'ai dit là-bas. Mais maintenant, en accédant aux propriétés du modèle, vous devrez gérer la possibilité qu'elles soient nulles. C'est correct s'ils peuvent être nuls, mais vous ne devriez pas les rendre facultatifs si cela affaiblit le modèle. Dans l'exemple, je peux voir que pictureOfMed serait peut-être optionnel (String), mais serait-il logique que tous les autres champs soient nuls?


@ces Eh bien, vous avez raison, bien sûr, travailler avec des options non optionnelles est plus sûr. Mais comme l'OP l'a dit, quand il "attribue simplement toutes les valeurs, cela fonctionne, cependant des propriétés comme justTook et tout ce que je ne veux pas commencer par une valeur". C'est pourquoi je pense que dans ce cas, travailler avec des options est plus approprié. Il a spécifiquement dit qu'il n'aimerait pas commencer avec des valeurs par défaut. Bien sûr, il doit calculer le risque de valeurs nulles dans son code. Votre réponse est toujours bonne mais imo.