/ / Чому Realm пропонує, щоб властивості List <T> оголошувались за допомогою “Let”? - стрімкий, царство

Чому Realm припускає, що властивості List <T> будуть оголошуватися за допомогою "let"? - Швидке, царство

Документація щодо нерухомості на до-багатьох стосунків заявляє про своє List<Dog> використання майна let:

class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}

Чому це List<T> майно, оголошене користуванням let коли інші типи властивостей Realm оголошено використанням dynamic var?

Відповіді:

7 для відповіді № 1

List<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> властивості