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ı:
1Bu, 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 10Görev
KolayElevator 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)")
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground