ProgramlamaiOS geliştirici

Swift'teki value types ve reference types arasındaki farkları açıklayın. Her birini ne zaman kullanmalısınız?

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

Cevap.

Swift'te iki ana veri türü vardır: value types (değer türleri) ve reference types (referans türleri).

  • Value types. Buna struct, enum ve Int, Double, Bool gibi temel türler dahildir. Bir değer iletildiğinde veya atanıldığında, değer kopyalanır; yani kopyadaki değişiklikler orijinal nesneyi etkilemez.
  • Reference types. Bunlar class ve bunlarla ilişkili türlerdir. Bir nesne iletildiğinde, nesnenin kendisi değil, ona olan referans kopyalanır; bu yüzden bir referans üzerinden yapılan değişiklikler diğer referanslarda da görünür.

Ne zaman kullanmalısınız:

  • Değerlerin bağımsız kopyalar olmasını istiyorsanız value types kullanın (örneğin, CGPoint, CGSize, durum paylaşmaması gereken modeller).
  • Reference types, nesneler arasında durum paylaşımı gerekiyorsa uygundur (örneğin, yöneticiler, kontrolörler, hizmetler).

Örnek:

struct Point { var x: Int var y: Int } class Person { var name: String init(name: String) { self.name = name } } var p1 = Point(x: 0, y: 0) var p2 = p1 p2.x = 10 // p1.x sıfır kalacak var person1 = Person(name: "Alex") var person2 = person1 person2.name = "Sam" // person1.name da "Sam" olacak

Tuzak bir soru.

Struct ve class için let arasındaki fark nedir? let kullanılarak oluşturulan bir class örneği tamamen değiştirilemez mi?

Cevap:

Değer türleri (struct) için let, nesneyi ve özelliklerini değiştirilemez hale getirir.

Referans türleri (class) için let, referansı yeniden atamayı engeller, ancak nesnenin özelliklerini korumaz. Eğer sınıf içinde let ile tanımlanmamışlarsa, değiştirilebilirler.

Örnek:

class Box { var value: Int init(value: Int) { self.value = value } } let box = Box(value: 10) box.value = 20 // TAMAM! // box = Box(value: 30) // Hata: box yeniden atanamaz

Konunun karmaşıklıklarını bilmemek yüzünden oluşan gerçek hata örnekleri.


Hikaye

Bir ödeme uygulamasında, işlem modeli bir sınıf olarak tanımlandı, oysa durum olmamalıydı. Bir hata oluştu: işlem listesiyle aynı anda çalışıldığında farklı arayüz parçalarının verileri üzerinde tahmin edilemez değişiklikler gerçekleşti. Modelleri struct olarak değiştirmeye karar verildi, böylece her bileşen kendi kopyası ile çalıştı.


Hikaye

Bir projede kullanıcı ayarları bir sınıfta saklandı, değerlerin iletildiğinde kopyalandığı düşünüldü. Veri değiştiğinde bir ekran diğerine istemeden etki ediyordu, çünkü ikisi de aynı nesneye olan referansı kullanıyordu.


Hikaye

Seri hale getirme modülünde model verileri referans türü olarak tanımlandı, bu nedenle yapılan her değişiklik önbellekte durum bozulmasına yol açtı. Değer türlerine geçtikten sonra sorun ortadan kalktı: veriler her işlemde bağımsız hale geldi.