Protokolleri Tanımlama
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 57.
Bir protokol, gereksinimleri (yöntemler ve özellikler) listeler, ancak bunları uygulamaz. Bir tür, her gereksinimi sağlayarak protokole uyar ve ardından protokolün beklendiği her yerde kullanılabilir:
protocol Describable {
func describe() -> String
}
struct Book: Describable {
let title: String
func describe() -> String { "Book: \(title)" }
}
print(Book(title: "Dune").describe())Çıktı:
Book: DuneKalıtımın aksine, bir protokol yapılar, sınıflar ve enum'lar için aynı şekilde çalışır ve bir tür birçok protokole uyabilir. Protokol yalnızca bir türün ne yapabileceğini söyler; her tür nasıl yapacağına kendisi karar verir:
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())Çıktı:
(1, 2)
highÖzellik gereksinimleri, özelliğin türünü ve özelliğin salt okunur ({ get }) veya aynı zamanda yazılabilir ({ get set }) olup olmadığını belirtir. Bir { get } gereksinimi, depolanan veya hesaplanan bir özellikle karşılanabilir:
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)Çıktı:
ada
Planet 3Bir tür uyumlu olduğunu iddia edip bir gereksinimi karşılamazsa derlenmez. Derleyici her uyumluluğu denetler; bu nedenle protokolü kullanan kod ona güvenebilir:
protocol Priced {
var price: Int { get }
func discounted(by percent: Int) -> Int
}
// struct Ticket: Priced { var price = 10 }
// hata: 'Ticket' türü 'Priced' protokolüne uymuyorGörev
KolaySalt okunur bir name özelliğine (String) ve Double döndüren bir area() yöntemine sahip bir Shape protokolü tanımlayın. Rectangle (width, height) ve Circle (radius, sayıları basit tutmak için π yerine 3.0 kullanarak) yapılarını, adları rectangle ve circle olacak şekilde bu protokole uygun hâle getirin.
Sağlanan kod, r,3,4 veya c,2 satırlarını okur, eşleşen şekli oluşturur ve rectangle: 12.0 çıktısını yazdırır.
Kodunuz Shape.swift, Rectangle.swift ve Circle.swift dosyalarına gider. main.swift, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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())")
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Özellikleri Derinlemesine İnceleme
Hesaplanan ÖzelliklerÖzellik GözlemcileriStatik ÜyelerMetotlu Enum'larTekrar - Sıcaklık Günlüğü6Protokoller
Protokolleri TanımlamaUyumlu TürlerProtokol UzantılarıTürler Olarak ProtokollerÖzet - Ödeme SistemiKendi başına pratik yap: Swift playground