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 }
3 Réponses :
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 }
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
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" }
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.
vous pouvez déclarer des variables comme optionnelles si vous ne voulez pas leur donner de valeur lors de l'initialisation.