Ekstensi Protokol
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 29 dari 57.
Ekstensi protokol memberikan implementasi default untuk method dalam sebuah protokol. Setiap tipe yang sesuai dengan protokol mendapatkannya secara otomatis, dan tipe tetap bisa memberikan versinya sendiri:
protocol Greeter {
var name: String { get }
func greet() -> String
}
extension Greeter {
func greet() -> String { "Hello, \(name)!" }
}
struct English: Greeter { let name: String }
struct Pirate: Greeter {
let name: String
func greet() -> String { "Ahoy, \(name)!" }
}
print(English(name: "Ada").greet())
print(Pirate(name: "Ada").greet())Output:
Hello, Ada!
Ahoy, Ada!Sebuah extension juga dapat menambahkan method baru yang hanya dibuat berdasarkan persyaratan. Tipe yang memenuhi persyaratan menulis bagian kecil yang diwajibkan dan mendapatkan sisanya:
protocol Scored {
var points: [Int] { get }
}
extension Scored {
var total: Int { points.reduce(0, +) }
var best: Int { points.max() ?? 0 }
func summary() -> String { "total \(total), best \(best)" }
}
struct Player: Scored {
let points: [Int]
}
print(Player(points: [3, 9, 4]).summary())Output:
total 16, best 9Ini membagikan perilaku di antara struct, class, dan enum tanpa pewarisan. Standard library bekerja dengan cara yang sama: setiap Collection mendapatkan isEmpty, first, dan map dari ekstensi protokol.
extension Collection {
// isEmpty, first, map, filter, ... semuanya didefinisikan sekali di sini
// dan setiap array, set, dictionary, serta string mendapatkannya
}Ekstensi terbatas menambahkan method hanya untuk beberapa tipe yang memenuhi persyaratan, ditulis dengan where:
protocol Container {
associatedtype Item
var items: [Item] { get }
}
extension Container where Item == Int {
var sum: Int { items.reduce(0, +) }
}
struct Box: Container {
var items: [Int]
}
print(Box(items: [2, 5]).sum)Output:
7Tantangan
MudahNyatakan protocol Priced yang mensyaratkan var price: Int { get } (dalam sen) dan var formatted: String { get }. Dalam extension protocol, berikan nilai default untuk formatted yang mengembalikan $4.50, lalu tambahkan method isAffordable(budget:) yang mengembalikan apakah harga sesuai dengan anggaran. Buat struct Coffee (harga 450) dan Sandwich (dengan price tersimpan) agar mematuhi protocol tersebut. Coffee harus mengganti nilai default formatted dengan coffee $4.50.
Kode yang disediakan membaca anggaran, lalu baris coffee atau sandwich,650. Kode tersebut mencetak formatted dan yes atau no untuk setiap item.
Tuliskan kodemu di Priced.swift, Coffee.swift, dan Sandwich.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
let budget = Int(input[0])!
for line in input.dropFirst() {
let item: any Priced = line == "coffee" ? Coffee() : Sandwich(price: Int(line.split(separator: ",")[1])!)
print("\(item.formatted) \(item.isAffordable(budget: budget) ? "yes" : "no")")
}
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