ProgramlamaiOS разработчик

Swift'teki yapılar (struct) nasıl çalışır, nesne sınıfları (class) ile depolama ve davranış düzeyinde ne gibi farklılıklar vardır, ve yapılar neden veri modelleme için daha sık kullanılır?

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

Cevap.

Soru Tarihçesi

Swift'te en başından itibaren değer türlerine (value types) — yapılar (struct) veri modelleme için ana araç olarak vurgu yapıldı. Objective-C'den farklı olarak, burada her şey nesne (sınıf) olduğu için, Swift basit modeller, veriler ve küçük iş nesneleri için yapıların kullanılmasını teşvik ediyor.

Sorun

Diğer nesne yönelimli dillerden deneyim sahibi birçok geliştirici, her şey için yanlışlıkla sınıfları kullanıyor. Bu, bellek sorunlarına (reference cycles), nesnelerin aktarımında beklenmedik değişikliklere ve thread safety ile ilgili zorluklara yol açıyor, çünkü sınıflar — referans türleridir.

Çözüm

Swift'teki yapılar bir değer türüdür (value types), atama ve fonksiyonlara geçişte kopyalanır, sınıfların (referans türleri) aksine. Bu durum, yapıları karmaşık yaşam döngüsü ve miras mantığına sahip olmayan modeller için öncelikli hale getirir.

Kod örneği:

struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x, 10 olarak kaldı

Önemli özellikler:

  • Yapının kopyalanması her zaman değerlerin kopyalanmasını (value semantics) tetikler
  • Bellek sızıntısı potansiyeli daha düşüktür
  • Miras almaz, yalnızca protokoller desteklenir

Yanıltıcı Sorular.

Bir yapının mirasçisi (subclass) olabilir mi?

Hayır, Swift'te yapılar miras almayı desteklemez. Davranışın genişletilmesi yalnızca protokoller ve uzantılar üzerinden mümkündür.

Yapılar, bir fonksiyona geçilirken her zaman kopyalanır mı?

Pratikte, Swift Copy-On-Write optimizasyonları kullanır. Yapıyı değiştirmediğimiz takdirde, yapı kopyalanmaz; kopya, yalnızca değişiklik yapıldığında oluşturulur. Bu, standart koleksiyonlar ve karmaşık yapılar için geçerlidir.

var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Burada sadece kopyalama gerçekleşir

Hangi durumlarda yapı kullanılamaz?

  • Kimlik (objectness, referansla karşılaştırma) gerektiğinde
  • Mirasçı gerektiğinde
  • Tekil bir örnek (singleton) olması gerektiğinde

Tipik Hatalar ve Anti-Desenler

  • Basit modeller ve veri yapıları için sınıf kullanımı
  • Yapı içinde referans türleri saklamak ve onları kopyalamaya çalışmak
  • Yapıyı "referansla" geçişte beklemek ve dış nesneyi yapı üzerinden değiştirmeye çalışmak

Gerçek Hayattan Örnek

Olumsuz Vaka

Aynı türde verileri saklamak için sınıflar kullanıldı (örneğin, haritadaki noktalar için), sonucunda — bellek erişimindeki sıkıntılar nedeniyle performans kaybı, karmaşık bellek yönetimi ve karışık referanslar ile ilgili hatalar meydana geldi.

Artılar:

  • AnyObject olarak dizide saklama olanağı

Eksiler:

  • Düşük performans
  • Thread safety zorlukları
  • Bellek yönetiminde sorunlar

Olumlu Vaka

Yapıların, güvenli bir şekilde kopyalanan veri modelleri olarak kullanılması, bellek sızıntısına neden olmaz ve gereksiz karmaşıklık içermez.

Artılar:

  • Kolaylık, güvenli kopyalama
  • Reference cycle'ların olmaması
  • Kolay test edilebilirlik

Eksiler:

  • Miras gerektiren desenlerin uygulanamaz olması
  • Eğer yapının içinde referans tipi varsa — kopyalama ve değişikliklerde sürprizler olabilir.