Soru Geçmişi:
Opaque types (some), Swift 5.1 ile ortaya çıktı ve bir fonksiyonun veya özelliğin döndürülen değerinin soyutlaşmasının yeni bir yolunu sağladı; burada tip derleyici tarafından biliniyor, ancak kullanıcıdan gizleniyor. Bu, protokol varoluşlarının (any Protocol) bir alternatifidir, ancak fonksiyon içinde belirli bir tipe sıkı bir bağlılık sunar.
Problem: Bir fonksiyon associatedtype (örneğin, Sequence) ile bir protokol döndürdüğünde, doğrudan yazılamaz:
func makeNumberSequence() -> Sequence { ... } // hata
Protokol varoluşları, herhangi bir uygulamayı döndürebilir, ancak her çağrıda aynı tipi garanti etmez:
func foo() -> any View { ... }
Bu, öngörülemezliğe ve zayıf bir type safety'e yol açar.
Çözüm: Opaque result type kullanmak:
func makeNumbers() -> some Sequence { [1, 2, 3] }
Artık derleyici döndürülmekte olan gerçek tipin kesinlikle ne olduğunu bilir, ancak dışarıdan gizlidir. Bu, performans optimizasyonu sağlar, güvenliği artırır, SwiftUI DSL kullanılmasına olanak tanır ve modüller arasında tip alışverişini kolaylaştırır.
Ana Özellikler:
Opaque types bir değeri (sınıf özellikleri gibi) saklamak için kullanılabilir mi?
Hayır. Opaque types sadece bir fonksiyonun döndürme değerleri veya hesaplanmış özellikler için uygulanır. Bir değeri veya değerler dizisini saklamak için varoluşlar (any Protocol) kullanılır.
Aynı fonksiyonun farklı dalları some ile farklı tipler döndürebilir mi?
Hayır. Derleyici, her iki (veya tüm) dalın aynı belirli tipi döndürmesini gerektirir, aksi takdirde hata olacaktır:
func foo(flag: Bool) -> some Sequence { if flag { return [1, 2, 3] } else { return ["a", "b", "c"] // hata } }
Some'ı, birden fazla fonksiyon arasında döndürülen tipleri tanımlamak için kullanabilir miyiz?
Hayır. Her some'lı fonksiyon kendi benzersiz gizli tipini döndürür, hatta bu aynı dizi olsa bile. Bir fonksiyonun sonucunu, başka bir fonksiyonda parametre olarak kullanmak mümkün değildir, eğer her ikisi de farklı protokoller veya farklı gizli tipler ile some kullanıyorsa.
Projede her şey any Protocol aracılığıyla döndürülüyor, koleksiyonlar tip güvenliğini kaybediyor, downcast'de hatalar ortaya çıkıyor, derleme süresi optimizasyonu yavaşlıyor.
Artılar:
Eksiler:
SwiftUI tasarımında bileşenler some View döndürüyor, her modül içsel tipini net bir şekilde tanımlıyor. Paket boyutu azalıyor, derleme hızı artıyor.
Artılar:
Eksiler: