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: DuneBerbeda 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)
highPersyaratan 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 3Jika 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'Tantangan
MudahDeklarasikan 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())")
}
}
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 Buku3Properti Lebih Dalam
Properti TerhitungPengamat PropertiAnggota StatisEnum dengan MethodRangkuman: Catatan Suhu6Protokol
Mendefinisikan ProtokolTipe yang Mematuhi ProtokolEkstensi ProtokolProtokol sebagai TipeRingkasan, Sistem PembayaranLatihan sendiri: Playground Swift