Jak nadpisać setter przechowywanej właściwości w Swift?
W Obj-C mogę nadpisać jego metodę ustawiającą, ale Swift nie wydaje się być zadowolony z tego, że metody pobierające / ustawiające są używane do przechowywanych właściwości.
Powiedzmy, że mam Card
klasę z właściwością o nazwie rank
. Nie chcę, aby klient nadał mu jakąkolwiek nieprawidłową wartość, dlatego w celu-C mogę nadpisać, setRank
aby wykonać dodatkowe sprawdzenie. Ale willSet
w Swift nie wydaje się pomagać, ponieważ newValue
jest stały i nie ma sensu przypisywać, rank
ponieważ ustawiający zostanie wywołany w pętli.
Odpowiedzi:
Dobrze. Czytając dokumentację Apples na Swift, znalazłem to :
Więc wszystko, co musisz zrobić, to:
źródło
var rankTimesTwo: Int { get { return rank * 2 } }
Nie możesz nadpisać
get
/set
dla przechowywanej właściwości, ale możesz użyć obserwatorów właściwościwillSet
/didSet
:Domyślne nazwy parametrów to
newValue
forwillSet
ioldValue
fordidSet
lub możesz je nazwać samodzielnie, jak wwillSet(newTotalSteps)
.źródło
Card
klasę z właściwością o nazwierank
. Nie chcę, aby klient nadawał mu jakąkolwiek wartość, dlatego w celu-C mogę nadpisać,setRank
aby wykonać dodatkowe sprawdzenie. AlewillSet
w Swift nie wydaje się pomagać, ponieważnewValue
jest stały i nie ma sensu przypisywać,rank
ponieważ ustawiający zostanie wywołany w pętli.didSet
do sprawdzeniarank
po ustawieniu, a jeśli nie powiedzie się walidacja, zresetuj ją do czegoś innego, np.oldValue
?get i set są dla obliczonych właściwości (nie mają żadnego magazynu zapasowego). (Moim zdaniem słowo kluczowe „var” jest tutaj mylące)
źródło
Jeśli nie chcesz używać didSet, który ma problem polegający na tym, że wartość właściwości jest tymczasowo nieprawidłowa, powinieneś owinąć wokół niego obliczoną właściwość.
Lub:
źródło
foo
jest to tylko obliczone wyrażenie_foo
, nie daj się zwieść słowu kluczowemu "var"! Oznacza to, że istnieją dwa wpisy dostępne z prywatnej przestrzeni nazw, ale nie ma to wpływu na wartość protected / public i przez cały czas zachowujefoo
ważność. Zasadniczo jest to wzorzec „widoku”. Problem , który pojawia się przy przepisywaniu przezdidSet
, oprócz tego, że ma okres nieważności, polega na tym, że istnieje znaczny potencjał nieskończonej pętli, ponieważ ponownie wchodzisz do programudidSet
obsługi od wewnątrzdidSet
.Uproszczony przykład:
Pełny przykład
Sprawdzić
perimeter
w tym przykładzie.Fragment z: Apple Inc. „Swift Programming Language”. iBooks. https://itun.es/us/jEUH0.l
źródło
perimeter
nadal jest obliczoną własnością. Jak nadpisać sideLength bez wprowadzania obliczonej właściwości?get
iset