Dokumentacja królestwa na do wielu relacji deklaruje swoje List<Dog>
własność let
:
class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}
Dlaczego to List<T>
właściwość deklarowana za pomocą let
gdy deklarowane są inne typy nieruchomości dynamic var
?
Odpowiedzi:
7 dla odpowiedzi № 1List<T>
właściwości należy zadeklarować za pomocą let
as Realm nie jest w stanie przechwycić przypisania do tych właściwości. Przypisywanie do List<T>
właściwości wygrywają, ponieważ twoje zmiany są zachowywane w pliku Realm let
zamiast var
wyszukujesz kompilator Swift, aby wykryć kod, który nie zrobi tego, co zamierzasz.
Zamiast przypisywać do List<T>
właściwości, które powinieneś zmutować istniejąca wartość nieruchomości za pomocą metod, które są częścią RangeReplaceableCollection
protokół do którego List<T>
dostosowuje się.
Na przykład, aby dodać nowego psa:
person.dogs.append(lassie)
Lub w celu zastąpienia istniejących psów:
person.dogs.replaceSubrange(0..<person.dogs.count, with: [fido, spot])
Czemu?
Klasy modeli rzeczywistych implementują się automatyczniepobierające i ustawiające dla utrwalonych właściwości, które uzyskują dostęp do bazowych danych bazy danych. W celu dostarczenia tych pobierających i ustawiających, twoje właściwości muszą być zadeklarowane przy pomocy dynamic
modyfikator. Ten modyfikator prosi Swift, aby dynamicznie wysyłał dostęp do właściwości za pomocą modułów pobierających i ustawiających, a nie bezpośrednio uzyskuje dostęp do elementu w czasie kompilacji. The dynamic
modyfikator ma znaczące ograniczenie: jest obsługiwany tylko dla typów, które mogą być reprezentowane w Objective-C. Dzieje się tak dlatego, że dynamiczne wysyłanie Swiftu oparte jest na środowisku wykonawczym Objective-C. To ograniczenie uniemożliwia Realom przechwytywanie zadań do List<T>
nieruchomości.