Menu
CoddyTech

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 private

Output:

1

Ini 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 10
challenge icon

Tantangan

Mudah

Lengkapi 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)")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift