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: 50Swift 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
falseTantangan
MudahLengkapi 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]))
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift