ProgramlamaKıdemli iOS Geliştirici

Swift'teki generics mekanizmasını tanımlayın. Genel tiplerle çalışırken tür güvenliğini nasıl sağlayabilirsiniz? Generic tiplerin kısıtlamalarına örnekler verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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 }

Şaşırtıcı soru.

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

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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.