Menu
Coddy logo textTech

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

Kalı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 3

Bir 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 uymuyor
challenge icon

Görev

Kolay

Salt 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())")
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Swift playground