Koşullu Uyum
Kısıtlar karşılandığında genel türleri protokole uydurun.
Koşullu Uyum, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Koşullu Uyumluluk Nedir?
Koşullu uyumluluk, jenerik bir türün tür parametreleri belirli kısıtlamaları karşıladığında bir protokole uyumlu olmasını sağlar. Klasik örnek şudur: Bir Array, yalnızca Element türü Equatable ise Equatable olur.
extension Array where Element: Equatable {
func allEqual(to x: Element) -> Bool {
allSatisfy { $0 == x }
}
}Yerleşik Örnek
Standart kitaplık bunu zaten kullanır: [Int], Int türü Equatable olduğu için Equatable'dır. İki dizi, öğeleri tek tek karşılaştırılarak eşitlik bakımından karşılaştırılır.
let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)Koşullu Uyumluluğu Bildirme
where koşuluyla protokol uyumluluğu ekleyen bir genişletme yazın. Burada bir sarmalayıcı, yalnızca değer türü de uyumlu olduğunda Equatable protokolüne uyar.
struct Pair<T> {
let first: T
let second: T
}
extension Pair: Equatable where T: Equatable {
static func == (l: Pair, r: Pair) -> Bool {
l.first == r.first && l.second == r.second
}
}
print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))Kısıtlama Neden Önemlidir?
Kısıtlama olmadan derleyici == işlemini kendiliğinden oluşturamazdı; çünkü sarılmış değeri karşılaştırmak için değerin kendisinin karşılaştırılabilir olması gerekir. where koşulu tam olarak bu güvenceyi sağlar.
struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}
print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))Koşullu Codable
Codable protokolüne koşullu olarak uyum sağlayabilirsiniz. Bir kapsayıcı, yalnızca öğesi kodlanabilir olduğunda kodlanabilir.
struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}
let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)Birden Çok Kısıtlama
Bir where koşulunda virgülle ayrılmış birden çok gereksinim listeleyebilirsiniz.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
func maxItem() -> T? { items.max() }
}
var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)Koşullu CustomStringConvertible
Bir türü, yalnızca içeriği yazdırılabilir olduğunda yazdırılabilir hâle getirin ve açıklamaları öğelerden birleştirin.
struct Labeled<T> { let label: String; let value: T }
extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
var description: String { label + ": " + value.description }
}
print(Labeled(label: "Age", value: 30))İç İçe Koşullu Uyumluluk
Koşullu uyumluluk birleşebilir: Int türünden oluşan dizi dizisi Equatable'dır; çünkü her katman kısıtlamayı zincirleme olarak sürdürür.
let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)Başka Bir Protokolle Kısıtlama
where koşulu, öğenin sizin tanımladığınız bir protokole uymasını gerektirebilir ve bu protokol üzerine kurulu davranışların kullanılmasını sağlar.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Array where Element: Priced {
var totalPrice: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 1.5), Item(price: 2.5)].totalPrice)Aynı Tür Kısıtlamaları
== kullanarak ilişkili bir türü belirli bir türle kısıtlayabilirsiniz. Buradaki yöntemler yalnızca String dizilerine uygulanır.
extension Array where Element == String {
func joinedUpper() -> String {
map { $0.uppercased() }.joined(separator: "-")
}
}
print(["a", "b", "c"].joinedUpper())Derleyici Bunu Nasıl Kullanır?
Koşullu uyumluluk, derleyicinin bir protokolün avantajlarını yalnızca geçerli oldukları durumda sağlamasına olanak tanır. Böylece jenerik kod hem güvenli hem de mümkün olduğunca yeniden kullanılabilir kalır.
struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))Hızlı Kontrol
Koşullu uyumluluk konusundaki anlayışınızı sınayın.
Özet
Koşullu uyumluluk, tür parametreleri kısıtlamaları karşıladığında uyumluluk sağlamak için extension Type: Protocol where ... yapısını kullanır. Bunu Equatable, Codable ve CustomStringConvertible için; protokol kısıtlamaları, aynı tür kısıtlamaları (==) ve iç içe kullanım ile gördünüz. Bu yaklaşım, jenerik türleri güvenli ve yeniden kullanılabilir tutar.
Sıkça Sorulan Sorular
“Koşullu Uyum” dersi ücretsiz mi?
Evet — “Koşullu Uyum” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Koşullu Uyum” dersinde ne öğreneceğim?
Kısıtlar karşılandığında genel türleri protokole uydurun. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Koşullu Uyum” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.