Menu
CoddyTech

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 9

Ini 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:

7
challenge icon

Tantangan

Mudah

Nyatakan 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")")
}
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