Sorunun Geçmişi:
Swift 5'e kadar, associated type'a sahip bir protokolü döndürürken sık sık kısıtlamalarla karşılaşılıyordu; tür, doğrudan return type olarak kullanılamıyordu, type erasure gerekiyordu. Okunabilirlik ve performansı artırmak için opaque types getirildi — some anahtar kelimesi aracılığıyla döndürülen değerler, kamu arayüzlerinde soyutlamaları tanımlamaya olanak tanır.
Problem:
Gerçek döndürülen türü gizlemek gerektiğinde, protokol aracılığıyla soyutlama koruyarak ancak dinamik dispatch ve type erasure maliyetlerinden kaçınmak için. Örneğin, koleksiyonlar, diziler, view bileşenleri döndürürken.
Çözüm:
Opaque types, protokole uygun olan türü döndürmeyi sağlar; ancak, özel uygulamasını gizler. Derleyici gerçek türü bilir, ancak çağrıda bulunan taraf bilmez.
Örnek:
protocol Shape { func area() -> Double } struct Circle: Shape { var radius: Double func area() -> Double { Double.pi * radius * radius } } func makeCircle() -> some Shape { return Circle(radius: 3) } let s = makeCircle() print(s.area()) // çalışıyor
Anahtar özellikler:
some ile dönen protokolün arkasında gizli tek bir türdürOpaque type (some Protocol), Protocol ile döndürülen türden nasıl farklıdır?
Opaque type, derleme aşamasında belirli bir uygulamaya sahiptir (dışarıdan gizli olsa da). Protocol döndürdüğünde dinamik dispatch çalışır, associated type varsa type safety yoktur.
Bir işlev içinde some Protocol kullanarak farklı türler döndürebilir miyiz?
Hayır. Tüm return'ler aynı gerçek türü döndürmelidir:
func maker(flag: Bool) -> some Shape { if flag { return Circle(radius: 3) } else { return Square(size: 2) // Hata: return type eşleşmiyor } }
Protocol içindeki associatedtype, some Protocol aracılığıyla kullanılabilir mi?
Evet. İşte bu (öncelikle) opaque type'ın amacı:
protocol View { associatedtype Body } func makeView() -> some View { /* ... */ }
Fonksiyon, opaque olmadan bir protokol döndürüyor, associated type içeren yöntemleri kullanmaya izin vermiyor, karmaşık bir type erasure gerekiyor, kod derlenmiyor veya optimal çalışmıyor.
Artıları:
Eksileri:
SwiftUI'de ViewBuilder, detayları gizleyerek, tür güvenliğini artırarak ve derleme ve çalışma zamanında hız artırarak some View kullanıyor.
Artıları:
Eksileri: