Menu
CoddyTech

Mendefinisikan Protokol

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

Sebuah protokol mencantumkan persyaratan (method dan property) tanpa mengimplementasikannya. Sebuah tipe mematuhi protokol dengan menyediakan setiap persyaratan, lalu tipe tersebut dapat digunakan di mana pun protokol diharapkan:

protocol Describable {
    func describe() -> String
}

struct Book: Describable {
    let title: String
    func describe() -> String { "Book: \(title)" }
}

print(Book(title: "Dune").describe())

Output:

Book: Dune

Berbeda dengan inheritance, protocol berlaku untuk struct, class, dan enum, serta sebuah tipe dapat mengadopsi banyak protocol. Protocol hanya menyatakan apa yang dapat dilakukan oleh sebuah tipe; setiap tipe menentukan bagaimana caranya:

protocol Describable {
    func describe() -> String
}

struct Point: Describable {
    var x = 0, y = 0
    func describe() -> String { "(\(x), \(y))" }
}

enum Level: Describable {
    case low, high
    func describe() -> String { self == .low ? "low" : "high" }
}

print(Point(x: 1, y: 2).describe())
print(Level.high.describe())

Output:

(1, 2)
high

Persyaratan property menyatakan tipe dan apakah property hanya bisa dibaca ({ get }) atau juga bisa ditulis ({ get set }). Persyaratan { get } dapat dipenuhi oleh property tersimpan atau terhitung:

protocol Named {
    var name: String { get }
}

struct User: Named {
    let name: String
}

struct Planet: Named {
    var number: Int
    var name: String { "Planet \(number)" }
}

print(User(name: "ada").name)
print(Planet(number: 3).name)

Output:

ada
Planet 3

Jika suatu tipe menyatakan bahwa ia memenuhi protokol tetapi melewatkan satu persyaratan, kode tidak dapat dikompilasi. Kompiler memeriksa setiap pemenuhan, jadi kode yang menggunakan protokol dapat mengandalkannya:

protocol Priced {
    var price: Int { get }
    func discounted(by percent: Int) -> Int
}

// struct Ticket: Priced { var price = 10 }
// error: tipe 'Ticket' tidak memenuhi protokol 'Priced'
challenge icon

Tantangan

Mudah

Deklarasikan protocol Shape dengan property name yang hanya bisa dibaca (String) dan method area() yang mengembalikan Double. Buat struct Rectangle (width, height) dan Circle (radius, gunakan 3.0 untuk π agar angkanya sederhana) agar mematuhi protocol tersebut, dengan nama rectangle dan circle.

Kode yang disediakan membaca baris r,3,4 atau c,2, membuat shape yang sesuai, lalu mencetak rectangle: 12.0.

Tulis kodemu di Shape.swift, Rectangle.swift, dan Circle.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan tetap seperti itu
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
    let p = line.split(separator: ",").map(String.init)
    if p[0] == "r" {
        let s = Rectangle(width: Double(p[1])!, height: Double(p[2])!)
        print("\(s.name): \(s.area())")
    } else {
        let s = Circle(radius: Double(p[1])!)
        print("\(s.name): \(s.area())")
    }
}
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