Menu
CoddyTech

Kontrol Akses

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 17 dari 57.

Enkapsulasi berarti sebuah tipe mengatur cara datanya dapat digunakan. Kontrol akses menentukan siapa yang dapat melihat property atau method. Menandai sebuah anggota dengan private menyembunyikannya dari semua kode di luar tipe tersebut (dan ekstensinya dalam file yang sama):

struct Account {
    private var balance = 0

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

var a = Account()
a.deposit(50)
// a.balance = 1_000_000   // error: 'balance' tidak dapat diakses karena tingkat perlindungan 'private'

Kode di luar hanya dapat menggunakan apa yang disediakan oleh tipe tersebut. Tipe tersebut dapat memeriksa setiap perubahan, sehingga datanya tidak pernah berada dalam keadaan yang tidak diizinkan oleh tipe tersebut:

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

Output:

balance: 50

Swift memiliki lima tingkat akses. Tanpa kata kunci, suatu anggota bersifat internal: terlihat di mana saja dalam module yang sama (aplikasi atau package-mu). Urutan tingkat akses dari paling terbuka hingga paling terbatas:

open        // module lain bisa menggunakan dan membuat subclass darinya (hanya untuk class)
public      // module lain bisa menggunakannya
internal    // bawaan: seluruh module
fileprivate // hanya file sumber ini
private     // tipe ini (beserta ekstensinya di dalam file)

Method helper privat menjaga antarmuka publik tetap kecil: pemanggil melihat fungsi tipe tersebut, bukan cara kerjanya.

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)

Output:

true
false
challenge icon

Tantangan

Mudah

Lengkapi struct Locker. code dan items-nya bersifat private. store(_:code:) menambahkan item hanya jika code cocok dan mengembalikan apakah item berhasil ditambahkan; items(code:) mengembalikan item yang tersimpan dan digabungkan dengan , (atau empty) jika code cocok, dan wrong code jika tidak.

Kode yang disediakan membaca code loker, lalu perintah put <code> <item> atau open <code>. Kode tersebut mencetak stored atau denied untuk setiap put, dan hasilnya untuk setiap open.

Tulis kodemu di Locker.swift. main.swift berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
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 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