Hanya Bisa Dibaca dari Luar
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 18 dari 57.
Sering kali, kode di luar harus dapat membaca property, tetapi tidak mengubahnya. private(set) mempertahankan getter pada tingkat akses normal dan menjadikan hanya setter bersifat private:
struct Counter {
private(set) var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
print(c.count)
// c.count = 99 // error: setter bersifat privateOutput:
1Ini cocok untuk nilai yang hanya boleh berubah melalui sebuah aturan, seperti skor yang hanya bertambah melalui tindakan yang valid:
class Player {
let name: String
private(set) var score = 0
private(set) var history: [Int] = []
init(name: String) { self.name = name }
func award(_ points: Int) {
guard points > 0 else { return }
score += points
history.append(points)
}
}
let p = Player(name: "Ada")
p.award(10)
p.award(-5)
p.award(3)
print(p.score)
print(p.history)Output:
13
[10, 3]Property let hanya dapat dibaca oleh siapa pun setelah instance dibuat, termasuk oleh method milik tipe itu sendiri. private(set) var tetap dapat diubah di dalam tipe tersebut. Pilih let untuk nilai yang tidak pernah berubah setelah dibuat:
class Order {
let id: Int // tidak pernah berubah
private(set) var status = "new" // berubah, tetapi hanya di dalam Order
init(id: Int) { self.id = id }
func ship() { status = "shipped" }
}Property komputasi hanya-baca adalah cara lain untuk menampilkan informasi tanpa mengizinkan perubahan, karena property ini sama sekali tidak memiliki setter:
struct Cart {
private var prices: [Int] = []
var total: Int { prices.reduce(0, +) }
var count: Int { prices.count }
mutating func add(_ price: Int) { prices.append(price) }
}
var cart = Cart()
cart.add(4)
cart.add(6)
print("\(cart.count) items, total \(cart.total)")Output:
2 items, total 10Tantangan
MudahLengkapi class Elevator. floor dan trips bisa dibaca dari luar, tetapi hanya bisa diubah oleh class (private(set)). goTo(_:) berpindah antara lantai 0 dan topFloor: perpindahan valid ke lantai yang berbeda akan memperbarui floor, menambahkan 1 ke trips, dan mengembalikan true; perpindahan yang tidak valid atau ke lantai yang sama akan mengembalikan false.
Kode yang disediakan membaca lantai teratas, lalu lantai tujuan. Kode mencetak floor 3 setelah perpindahan atau stay 3 saat perpindahan ditolak, lalu mencetak trips: beserta jumlahnya.
Letakkan kodemu di Elevator.swift. main.swift berisi kode 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) }
let lift = Elevator(topFloor: Int(input[0])!)
for line in input.dropFirst() {
let moved = lift.goTo(Int(line)!)
print("\(moved ? "floor" : "stay") \(lift.floor)")
}
print("trips: \(lift.trips)")
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