2016-03-31 4 views
0

Я добавил свойство объекта 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 class Loan .'

Вопрос: Как я могу создать экземпляр Объект ссуды во время миграции, чтобы заполнить свойство calculation?

Я не хочу это делать lazy, потому что его нужно пересчитывать при изменении других свойств. Кроме того, это вычислимое свойство не является хорошим решением, потому что для вычисления значения с каждым доступом требуется некоторое время.

ответ

1

Я думаю, что вы можете использовать KVC для заполнения свойств объекта кредита. Пример:

// 1. Create empty loan object 
let loan = Loan() 

// 2. Fill loan object's properties with old object 
let propertyNames = oldObject.objectSchema.properties.map { $0.name } 
let values = oldObject.dictionaryWithValuesForKeys(propertyNames) 
loan.setValuesForKeysWithDictionary(values) 

// 3. Create standalone calcuration object 
let calculation = CalculationHelper.calculate(loan) 

// 4. Save calculation object and assign 
newObject[LoanPropNames.Calculation] = migration.create(CalculationResult.className(), value: calculation) 
+0

Благодарим за ответ. Если я использую этот код, я получаю ошибку времени выполнения внутри 'CalculationHelper.calculate (loan)', когда я получаю доступ к свойству 'extras', потому что это' RealmSwift.DynamicObject', в то время как калькулятор ожидает, что он будет иметь тип 'Extra': Не удалось отличить значение типа 'RealmSwift.DynamicObject' (0x10d14c758) в 'loan_calculator.Extra' – RustamG

+0

@RustamG Это зависит от 'func calculate (loan: Loan) -> CalculationResult'. Можете ли вы поделиться кодом 'func calculate()'? –

+0

Пока моя модель «Extra» не изменилась, я сделал преобразование таким простым, как: 'let extras = List (); extras.appendContentsOf (значения [LoanPropNames.Extras] .map {Extra (значение: $ 0)}); значения [LoanPropNames.Extras] = дополнительные функции' – RustamG