Я добавил свойство объекта calculation
к объекту realm, и теперь я застрял в установке значения для него внутри блока миграции, потому что я не могу создать экземпляр объекта, чтобы передать его калькулятор.Объект объекта объекта со старой схемой внутри блока миграции
Вот моя модель:
import Foundation
import RealmSwift
class Loan: Object {
dynamic var id: String = NSUUID().UUIDString
dynamic var creationDate: NSDate = NSDate()
dynamic var title: String = ""
dynamic var amount: Double = 0.0
dynamic var rate: Float = 0.0
dynamic var term: Int = 0
dynamic var type: Int = TYPE_ANNUITY
dynamic var firstPaymentDate: NSDate = NSDate()
dynamic var issueDate: NSDate?
let extras = List<Extra>() // this is a list of nested realm models which is also used for calculation
dynamic var calculation: CalculationResult? // !! added this property !!
static let TYPE_ANNUITY = 0
static let TYPE_GRADED = 1
override class func primaryKey() -> String? {
return LoanPropNames.Id
}
}
struct LoanPropNames {
static let CreationDate = "creationDate"
static let Id = "id"
static let Calculation = "calculation"
}
Значение для calculation
рассчитывается методом хелперов с подписью, как это:
func calculate(loan: Loan) -> CalculationResult
Вот код конфигурации для Realm:
class RealmConfigurator {
private static let schemaVersionAddedCalculationProp: UInt64 = 1
private static let schemaVersionLatest = schemaVersionAddedCalculationProp
static func createConfiguration() -> Realm.Configuration {
return Realm.Configuration(
schemaVersion: schemaVersionLatest,
migrationBlock: {
migration, oldSchemaVersion in
if oldSchemaVersion < schemaVersionAddedCalculationProp {
migration.enumerate(Loan.className()) {
oldObject, newObject in
if let oldObject = oldObject,
let newObject = newObject {
// this is how I try to instantiate a loan to pass it to the CalculationHelper
let loan = Loan(value: oldObject, schema: migration.oldSchema)
newObject[LoanPropNames.Calculation] = CalculationHelper.calculate(loan)
}
}
}
}
)
}
}
Проблема в lin е
let loan = Loan(value: oldObject, schema: migration.oldSchema)
Компилятор говорит
Cannot convert value of type 'Schema' to expected argument type 'RLMSchema'
Если я пытаюсь запустить его так: пусть кредит = Кредита (стоимость: oldObject)
я получаю сообщение об ошибке выполнения:
Terminating app due to uncaught exception 'RLMException', reason: 'Invalid property name
calculation
for classLoan
.'
Вопрос: Как я могу создать экземпляр Объект ссуды во время миграции, чтобы заполнить свойство calculation
?
Я не хочу это делать lazy
, потому что его нужно пересчитывать при изменении других свойств. Кроме того, это вычислимое свойство не является хорошим решением, потому что для вычисления значения с каждым доступом требуется некоторое время.
Благодарим за ответ. Если я использую этот код, я получаю ошибку времени выполнения внутри 'CalculationHelper.calculate (loan)', когда я получаю доступ к свойству 'extras', потому что это' RealmSwift.DynamicObject', в то время как калькулятор ожидает, что он будет иметь тип 'Extra': Не удалось отличить значение типа 'RealmSwift.DynamicObject' (0x10d14c758) в 'loan_calculator.Extra' – RustamG
@RustamG Это зависит от 'func calculate (loan: Loan) -> CalculationResult'. Можете ли вы поделиться кодом 'func calculate()'? –
Пока моя модель «Extra» не изменилась, я сделал преобразование таким простым, как: 'let extras = List(); extras.appendContentsOf (значения [LoanPropNames.Extras] .map {Extra (значение: $ 0)}); значения [LoanPropNames.Extras] = дополнительные функции' –
RustamG