我已经为一个领域对象添加了一个 calculation
属性,现在我不得不在迁移块中设置它的值,因为我无法实例化一个对象将它传递给计算器 .
这是我的模型:
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)
}
}
}
}
)
}
}
问题就在于此
let loan = Loan(value: oldObject, schema: migration.oldSchema)
编译说
无法将'Schema'类型的值转换为预期的参数类型'RLMSchema'
如果我尝试像这样运行:let loan = Loan(value:oldObject)
我得到运行时错误:
由于未捕获的异常“RLMException”而终止应用程序,原因是:“类贷款的属性名称计算无效 . ”
Question :如何在迁移期间实例化Loan对象以填充 calculation
属性?
我不想让它成为 lazy
,因为当其他属性发生变化时需要重新计算 . 使它成为计算属性也不是一个好的解决方案,因为每次访问需要一段时间来计算值 .
1 回答
我认为您可以使用KVC来填充贷款对象的属性 . 如下: