Değiştirici Metotlar
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 9 / 57.
Bir özelliği değiştiren struct metodu mutating olarak işaretlenmelidir. Bu anahtar kelime olmadan metot derlenmez, çünkü bir değer türünün metotları self ifadesini sabit olarak ele alır:
struct Counter {
var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
c.increment()
print(c.count)Çıktı:
2Değiştirici bir yöntem yalnızca var üzerinde çağrılabilir. Bir let sabitinde çağrı derlenmez, çünkü değerin tamamı sabittir:
var a = Counter()
a.increment() // iyi
let b = Counter()
// b.increment() // hata: b bir let sabitiYalnızca özellikleri okuyan yöntemler değişmez kalır ve sabitlerle de çalışır. İyi bir tasarım, değişiklikleri birkaç değiştirici yöntemde tutar:
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)Çıktı:
8
3Değiştirici bir yöntem, self değerini tamamen değiştirebilir; bu, bir değeri sıfırlamak için kullanışlıdır:
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)Çıktı:
0Görev
KolayWallet struct'ını tamamlayın. add(_:) ve spend(_:) değiştiricidir: spend yalnızca yeterli para kaldığında çıkarma yapar ve bunu yapıp yapmadığını döndürür. report() değiştirici değildir ve balance 40 döndürür.
Sağlanan kod +n ve -n komutlarını okur, bunları tek bir var wallet'ına uygular, reddedilen harcamalar için denied yazdırır ve son olarak report() çıktısını yazdırır.
Kodunuz Wallet.swift dosyasına yazılmalıdır. main.swift sağlanan giriş/çıkış 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) }
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())
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