Я пытаюсь создать взаимозависимость между таблицей лекарств и таблицей побочных эффектов. RealmObject - это настраиваемый класс, созданный из класса Object.
Определения модели:
class Medication: RealmObject {
@objc dynamic var name : String?
@objc dynamic var form : String?
@objc dynamic var id : String?
let medToSideEffect = List<SideEffect>()
override class func primaryKey() -> String? {
return "id"
}
}
class SideEffect: RealmObject {
@objc dynamic var masterSideEffectId : String = ""
@objc dynamic var entityType : String = ""
@objc dynamic var entityId : String = ""
@objc dynamic var sideEffect : String = ""
@objc dynamic var id : String = ""
@objc dynamic var uniqueId : String = ""
override class func primaryKey() -> String? {
return "uniqueId"
}
}
Код теста:
let medicationItem = Medication(dict: medication)
let sideEffectItems = List<SideEffect>()
for sideEffect in sideEffectList {
let sideEffectItem = SideEffect()
sideEffectItem.id = self.getMongoId()
sideEffectItem.entityType = "Medicine"
sideEffectItem.entityId = medicationItem.id!
sideEffectItem.sideEffect = (sideEffect as? String)!
sideEffectItem.uniqueId = "\(medicationItem.id!)_\(((sideEffect as? NSString)?.replacingOccurrences(of: " ", with: "_"))!)"
sideEffectItems.append(sideEffectItem)
medicationItem.medToSideEffect.append(sideEffectItem)
}
После этого процесса, когда я распечатываю medicationItem, вывод будет следующим.
Medication {
name = Paracetomol 650mg;
form = tab;
id = 5af96e79efb27f6bd5c25a66;
}
Побочные эффекты должны были быть добавлены к объекту лекарства. но это уже не так. Он работал нормально до последнего обновления Realm 3.11.0.
Пожалуйста, дайте мне знать, если код неверен.
Как мы узнаем, что sideEffectList не пустой в вашем тесте?
@JoakimDanielson не пусто. Я на всякий случай записал массив.
@ValW Я не думаю, что здесь что-то изменится.
Я хотел спросить, что вся информация недоступна для нас, поэтому трудно понять, почему она не работает. Я думаю, что лучший способ продвинуться вперед - это использовать отладчик, чтобы увидеть, что происходит.





Может быть, потому, что вы объявляете свой список «неизменным», а может быть, потому что ваш список является структурой и, следовательно, возвращается копия.
let medToSideEffect = List<SideEffect>()
И поэтому это не может быть изменено. Попробуйте (предупреждающий непроверенный код)
public private(set) var medToSideEffect = List<SideEffect>()
и добавить функцию
public func append(sideEffect: SideEffect) {
self.medToSideEffect.append(sideEffect)
}
Бит 'public private (set)' означает, что список виден извне, но может быть изменен только экземпляром класса-владельца.
Это не так. Вы должны объявить свойства List как неизменяемые, поскольку List является ссылочным типом, и в большинстве случаев вы не хотите изменять ссылку на List, вы хотите только изменить его элементы, что все еще возможно, если его объявляется неизменным.
Упс, плохо. Я думал «Свифт», а не «Свифт из Царства». А где же этот смущенный смайлик?
Обновлено: https://stackoverflow.com/a/52704564/6700116 Нашел решение.
Перейдите к вашему целевому Build Settings и установите флаг Reflection Metadata Level на All
Вопрос обсуждается здесь. https://github.com/realm/realm-cocoa/issues/5944#issuecomment-426948127
Я бы просто сделал let sideEffects = List <SideEffect> () одним из атрибутов Medication.