Method yang Mengubah Nilai
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 9 dari 57.
Method struct yang mengubah property harus diberi tanda mutating. Tanpa kata kunci tersebut, method tidak dapat dikompilasi karena method pada tipe nilai menganggap self sebagai konstanta:
struct Counter {
var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
c.increment()
print(c.count)Output:
2method yang mengubah nilai hanya dapat dipanggil pada var. Pada konstanta let, pemanggilan ini tidak dapat dikompilasi karena seluruh nilainya tetap:
var a = Counter()
a.increment() // tidak masalah
let b = Counter()
// b.increment() // error: b adalah konstanta letMethod yang hanya membaca property tetap tidak mengubah data dan juga bisa digunakan pada konstanta. Desain yang baik membatasi perubahan pada beberapa method yang mengubah data:
struct Stack {
var items: [Int] = []
mutating func push(_ x: Int) { items.append(x) }
mutating func pop() -> Int? { items.popLast() }
func peek() -> Int? { items.last }
}
var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)Output:
8
3Method mutasi dapat mengganti seluruh self, yang berguna untuk mengatur ulang nilai:
struct Score {
var points = 0
var bonus = 0
mutating func reset() {
self = Score()
}
}
var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)Output:
0Tantangan
MudahLengkapi struct Wallet. add(_:) dan spend(_:) bersifat mutating: spend mengurangi saldo hanya jika uang yang tersisa cukup, lalu mengembalikan apakah pengurangan dilakukan. report() tidak bersifat mutating dan mengembalikan balance 40.
Code yang disediakan membaca perintah +n dan -n, menerapkannya pada satu dompet var, mencetak denied jika pengeluaran ditolak, lalu mencetak report().
Tulis kodemu di Wallet.swift. main.swift berisi code input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
var wallet = Wallet()
for cmd in input {
let amount = Int(cmd.dropFirst())!
if cmd.hasPrefix("+") {
wallet.add(amount)
} else if !wallet.spend(amount) {
print("denied")
}
}
print(wallet.report())
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift