Generics (genel tipler), esnek ve yeniden kullanılabilir fonksiyonlar ve tipler tanımlamaya olanak tanır. Swift'in temel özelliği - tür güvenliğinin korunmasıdır: derleyici, belirli tiplerle çalışmayı derleme zamanında kontrol eder. Genel tipleri, where koşulları, protokollerden miras alma ve bunların kombinasyonları aracılığıyla kısıtlayabilirsiniz.
Kod örneği:
func swapValues<T>(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp } protocol Drawable { func draw() } func drawAll<T: Drawable>(_ items: [T]) { for item in items { item.draw() } } // Protokol ve where koşuluna göre kısıtlama func compareValues<T: Equatable>(_ a: T, _ b: T) -> Bool { return a == b }
Generic fonksiyonlar aşırı yüklenmiş fonksiyonlar olarak işlev görebilir mi? Derleyici uygun implementasyonu nasıl seçer?
Cevap: Evet, generic fonksiyonlar normal ve diğer generic fonksiyonlarla aşırı yüklenebilir. Derleyici, en spesifik implementasyonu seçmeye çalışır. Örnek:
func printValue(_ value: Int) { print("Int: \(value)") } func printValue<T>(_ value: T) { print("Generic: \(value)") } printValue(5) // Int: 5 printValue("Swift") // Generic: Swift
Hikaye
Ekip, indeks bulmak için bir diziyi genel genişletme yazdı, ancak tipi Equatable ile kısıtlamayı unuttu. Bu, Equatable olmayan elemanlar içeren bir dizide genişletmeyi uygulamaya çalışırken derleme hatasına yol açtı.
Hikaye
Projede, tür kısıtlaması olmadan genel nesneler için bir önbellek uygulamaya çalıştılar. Sonuç olarak, runtime'da downcast yapmaya çalışırken çökme meydana geldi - gerçek güvenli kullanım, associated type ve kısıtlamalarla protokoller aracılığıyla sağlanabilirdi.
Hikaye
Geliştiriciler genel bir sınıf uyguladılar, ancak miras alma ve yeniden tanımlama sırasında mirasçıların tam genel parametrelerini belirtmeyi unuttular. Bu nedenle kod derlenemedi ve tür hiyerarşisinin tamamen yeniden yapılması gerekti.