Bagaimana cara menimpa penyetel properti tersimpan di Swift?
Di Obj-C, saya bisa menimpa penyetelnya, tetapi Swift tampaknya tidak senang dengan pengambil / penyetel yang digunakan untuk properti tersimpan.
Katakanlah saya memiliki Card
kelas dengan properti bernama rank
. Saya tidak ingin klien memberikan nilai yang tidak valid, oleh karena itu, dalam objektif-C, saya dapat menimpa setRank
sehingga ia melakukan pemeriksaan tambahan. Tetapi willSet
di Swift sepertinya tidak membantu karena newValue
konstan dan tidak masuk akal untuk menetapkan rank
karena penyetel akan dipanggil dalam satu lingkaran.
Jawaban:
Baik. Membaca dokumentasi Apel di Swift saya menemukan ini :
Jadi yang harus Anda lakukan adalah ini:
sumber
var rankTimesTwo: Int { get { return rank * 2 } }
Anda tidak dapat mengganti
get
/set
untuk properti tersimpan tetapi Anda dapat menggunakan pengamat propertiwillSet
/didSet
:Nama parameter default adalah
newValue
untukwillSet
danoldValue
untukdidSet
, atau Anda dapat menamainya sendiri seperti diwillSet(newTotalSteps)
.sumber
Card
kelas dengan properti bernamarank
. Saya tidak ingin klien memberikan nilai apa pun, oleh karena itu, dalam tujuan-C, saya dapat menimpasetRank
sehingga ia melakukan pemeriksaan tambahan. TetapiwillSet
di Swift sepertinya tidak membantu karenanewValue
konstan dan tidak masuk akal untuk menetapkanrank
karena penyetel akan dipanggil dalam satu lingkaran.didSet
untuk memeriksarank
setelah disetel dan jika validasi gagal, setel ulang ke yang lain misalnyaoldValue
?get dan set adalah untuk properti yang dihitung (mereka tidak memiliki penyimpanan pendukung). (Menurut pendapat saya, kata kunci 'var' membingungkan di sini)
sumber
Jika Anda tidak ingin menggunakan didSet, yang memiliki masalah bahwa nilai properti untuk sementara salah, Anda harus menggabungkan properti yang dihitung di sekitarnya.
Atau:
sumber
foo
hanyalah ekspresi yang dihitung dari_foo
, jangan biarkan kata kunci "var" menipu Anda! Ini berarti bahwa ada dua entri yang dapat diakses dari namespace privat, tetapi itu tidak ada hubungannya dengan protected / publik dan menjaga nilainya tetapfoo
valid setiap saat. Ini pada dasarnya adalah pola "tampilan". Masalah yang Anda dapatkan dengan menulis ulang viadidSet
, selain itu memiliki periode tidak valid, adalah bahwa ada potensi signifikan untuk loop tak terbatas karena Anda memasukkan kembalididSet
handler dari dalamdidSet
.Contoh yang Disederhanakan:
Contoh lengkapnya
Lihat
perimeter
contoh ini.Kutipan Dari: Apple Inc. "The Swift Programming Language." iBooks. https://itun.es/us/jEUH0.l
sumber
perimeter
masih merupakan properti yang dihitung. Bagaimana cara menimpa sideLength tanpa memasukkan properti yang dihitung?get
danset