Menu
Coddy logo textTech

Dışarıdan Salt Okunur

Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 18 / 57.

Çoğu zaman kodun dışındaki kısım bir özelliği okumalı, ancak değiştirmemelidir. private(set) alıcıyı normal düzeyde tutar ve yalnızca yazıcıyı private yapar:

struct Counter {
    private(set) var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
print(c.count)
// c.count = 99   // hata: setter private

Çıktı:

1

Bu, yalnızca bir kural aracılığıyla değişmesi gereken değerlere uygundur; örneğin yalnızca geçerli eylemler yoluyla artan bir skor:

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)

Çıktı:

13
[10, 3]

Bir let özelliği, örnek oluşturulduktan sonra türün kendi metotları da dâhil olmak üzere herkes için salt okunurdur. private(set) var ise türün içinde değiştirilebilir kalır. Oluşturulduktan sonra hiç değişmeyen değerler için let kullanın:

class Order {
    let id: Int                 // asla değişmez
    private(set) var status = "new"   // değişir, ama yalnızca Order içinde
    init(id: Int) { self.id = id }
    func ship() { status = "shipped" }
}

Salt okunur bir hesaplanmış özellik, değişikliklere izin vermeden bilgi sunmanın başka bir yoludur; çünkü hiç setter'ı yoktur:

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)")

Çıktı:

2 items, total 10
challenge icon

Görev

Kolay

Elevator sınıfını tamamla. floor ve trips dışarıdan okunabilir, ancak yalnızca sınıf tarafından değiştirilebilir (private(set)). goTo(_:), 0 ile topFloor arasındaki katlar arasında hareket eder: farklı bir kata yapılan geçerli bir hareket floor değerini günceller, trips değerine 1 ekler ve true döndürür; geçersiz veya aynı kata yapılan bir hareket false döndürür.

Sağlanan kod, en üst katı ve ardından hedef katları okur. Bir hareketten sonra floor 3, hareket reddedildiğinde ise stay 3 yazdırır ve son olarak sayaçla birlikte trips: yazdırır.

Kodun Elevator.swift dosyasına yazılmalıdır. main.swift dosyası, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Swift playground