Menu
Coddy logo textTech

Erişim Denetimi

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

Kapsülleme, bir türün verilerinin nasıl kullanılabileceğini denetlemesi anlamına gelir. Erişim denetimi, bir özelliği veya yöntemi kimlerin görebileceğine karar verir. Bir üyeyi private olarak işaretlemek, onu türün dışındaki tüm kodlardan (ve aynı dosyadaki uzantılarından) gizler:

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}

var a = Account()
a.deposit(50)
// a.balance = 1_000_000   // hata: 'balance' 'private' koruma seviyesi nedeniyle erişilemez

Kod dışındaki kısım yalnızca türün sunduklarını kullanabilir. Tür, her değişikliği denetleyebilir; böylece verileri hiçbir zaman türün izin vermediği bir durumda kalmaz:

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        if amount > 0 { balance += amount }
    }

    func report() -> String {
        "balance: \(balance)"
    }
}

var a = Account()
a.deposit(50)
a.deposit(-999)
print(a.report())

Çıktı:

balance: 50

Swift'te beş erişim düzeyi vardır. Bir anahtar sözcük kullanılmadığında bir üye internal olur: aynı modülün (uygulamanızın veya paketinizin) her yerinde görünür. En açıktan en kısıtlıya doğru düzeyler:

open        // diğer modüller kullanabilir ve alt sınıf oluşturabilir (yalnızca sınıflar)
public      // diğer modüller kullanabilir
internal    // varsayılan: tüm modül
fileprivate // yalnızca bu kaynak dosya
private     // bu tip (ve dosyadaki uzantıları)

Özel yardımcı metotlar herkese açık yüzeyi küçük tutar: çağıranlar, türün bunu nasıl yaptığını değil, ne yaptığını görür.

struct Password {
    private let text: String

    init(_ text: String) { self.text = text }

    var isStrong: Bool {
        hasDigit() && text.count >= 8
    }

    private func hasDigit() -> Bool {
        text.contains { $0.isNumber }
    }
}

print(Password("secret123").isStrong)
print(Password("short1").isStrong)

Çıktı:

true
false
challenge icon

Görev

Kolay

Locker yapısını tamamla. code ve items özellikleri private durumundadır. store(_:code:), yalnızca kod eşleştiğinde bir öğe ekler ve eklenip eklenmediğini döndürür; items(code:), kod eşleştiğinde depolanan öğeleri , ile birleştirerek (veya empty) döndürür, aksi takdirde wrong code döndürür.

Verilen kod, kilidin kodunu okur ve ardından put <code> <item> veya open <code> komutlarını işler. Her put için stored veya denied yazdırır; her open için ise sonucu yazdırır.

Kodun Locker.swift dosyasına yazılmalıdır. main.swift, verilen 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) }
var locker = Locker(code: input[0])
for cmd in input.dropFirst() {
    let p = cmd.split(separator: " ").map(String.init)
    if p[0] == "put" {
        print(locker.store(p[2], code: p[1]) ? "stored" : "denied")
    } else {
        print(locker.items(code: p[1]))
    }
}
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