Документація щодо нерухомості на до-багатьох стосунків заявляє про своє List<Dog>
використання майна let
:
class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}
Чому це List<T>
майно, оголошене користуванням let
коли інші типи властивостей Realm оголошено використанням dynamic var
?
Відповіді:
7 для відповіді № 1List<T>
властивості слід оголосити за допомогою let
оскільки Realm не в змозі перехопити призначення цих властивостей. Призначення до List<T>
властивості не призведуть до того, що ваші зміни зберігаються у файлі Realm. Декларуючи властивість за допомогою let
а не var
ви зараховуєте компілятор Swift, щоб виявити код, який не виграв те, що ви хочете.
Замість того, щоб призначати List<T>
властивості, які ви повинні мутувати наявна вартість властивості методами, що входять до складу RangeReplaceableCollection
протокол до якого List<T>
відповідає.
Наприклад, щоб додати нову собаку:
person.dogs.append(lassie)
Або замінити існуючих собак:
person.dogs.replaceSubrange(0..<person.dogs.count, with: [fido, spot])
Чому?
Класи реальної моделі автоматично реалізуютьсягеттери та сеттери для ваших збережених властивостей, які отримують доступ до базових даних бази даних. Щоб надати ці геттери та сетери, ваші властивості повинні бути оголошені символом dynamic
модифікатор. Цей модифікатор просить Swift динамічно відправляти доступ до властивостей за допомогою getters та setters, а не безпосередньо звертатися до члена під час компіляції. The dynamic
модифікатор має суттєве обмеження: він підтримується лише для типів, які можуть бути представлені в Objective-C. Це пояснюється тим, що динамічна відправка Свіфта побудована поверх часу виконання Objective-C. Саме це обмеження перешкоджає Realm перехоплювати завдання для List<T>
властивості