Swift'te Değer ve Referans Tipleri

Merhaba, bu blogda value/reference (değer/referans) tiplerinin özelliklerini, benzerliklerini ve farklılıklarını öğreneceksiniz. Aynı zamanda bu soyut kavramları aklınızda daha iyi canlandırmak için kod örnekleri ile pekiştireceğiz.

Swift’teki türler iki kategoriye ayrılır. İlk kategori olan değer tipinde (value type) struct, enum, Tuple, Int, Bool, String ve Dictionary bulunur. Bu tiplerden biri ile tanımladığınız verilerin her biri hafızada benzersiz (unique) bir değer ile eşitlenir.

Diğer kategori olan referans tipine örnek olarak class verilebilir. Class’tan oluşturduğumuz bir nesneyi farklı onlarca değişkene atasak bile hafızada karşılık geldiği değer aynı kalacaktır. Adından da belli olduğu gibi her değişken için yeni bir değer atamak yerine ilk değeri referans alacaktır.

class Cars {
  var brand = ""
}

var car1 = Cars()
car1.brand = "BMW"

var car2 = car1
car2.brand = "Fiat"

print(car1.brand) // Fiat
print(car2.brand) // Fiat

Cars adında bir class oluşturuyoruz ve cars1 adında bir örnek oluşturuyoruz. Aynı zamanda cars1 değişkeninin, brand property’sini “BMW” olarak tanımlıyoruz. Daha sonra cars2 adındaki değişkeni cars1 tipinden oluşturuyoruz. cars2 değişkeninin brand property’sini ise “Fiat” olarak tanımlıyoruz. Çıktıya baktığımızda cars1 ve cars2’nin aynı çıktıyı verdiğini görüyoruz.

Bu sizi ilk bakışta biraz şaşırtabilir fakat referans tipleri az önce de bahsettiğim gibi hafızada tek bir yeri işaret ettiğinden dolayı yaptığımız tüm değişiklikler hafızadaki tek bir noktayı değiştiriyor. Bir de aynı örneği struct yani bir değer tipi ile deneyelim.

struct Cars {
  var brand = ""
}

var cars1 = Cars()
cars1.brand = "BMW"

var cars2 = cars1
cars2.brand = "Fiat"

print(cars1.brand) // BMW
print(cars2.brand) // Fiat

Gördüğünüz gibi bu sefer işler biraz daha değişti, değer tipleri hafızada her değişken tanımladığımızda yeni bir kopya oluşturuyor. cars1 ve cars2 arasında herhangi bir bağ kalmıyor ve birbirlerinden bağımsız olarak hafızada tutuluyorlar.

Umarım bir şeyler daha anlaşılır olmaya başlamıştır, şimdi de bu konuda benim en sevdiğim grafiklerden birini sizlerle paylaşmak istiyorum.

Hangisini Tercih Etmeli?

Değer tipi kullanmanız gereken durumlar:

  • Veriler == ile kıyaslanır.

  • Birbirinden bağımsız durumda kopyalar üretmek gerektiğinde.

  • Veri multi-thread ile kullanılacağında.

Referans tipi kullanmanız gereken durumlar:

  • Veriler === ile kıyaslanır.

  • Paylaşılacak ortak değişken kullanıldığında.

Elbette her iki türün de pozitif ve negatif yanları var, önemli olan faydalı olanı kullanmak olacaktır.

Değer Tipinin Avantajları

  • Verimlilik: Değer Tipleri RAM’de stack üzerinde tutulmaktadır. Stack’e ulaşmak, heap’e ulaşmaktan çok daha hızlı bir yöntem olduğu için tercih edilir.

  • Thread Safe: Değer türleri her seferinde birbirinden bağımsız kopyalar yaratır. Aynı thread üzerinde birden fazla işlem yapmak programın kilitlenmesine neden olabilir, bu noktada değer tipi seçmek daha güvenli bir yol olacaktır.

  • Memory Leak: Swift’te verilerin temizleme işlemini ARC yapar, örneğin bir sınıf oluşturduğumuzda örneği oluşturulan sınıfın kaç kez kullanıldığı bilgisini tutar ve sayı 0’a düştüğünde o değeri hafızadan siler. Fakat değer tipinin bir referansı olmadığı için memory leak gerçekleşmez.

  • Tahmin Edilebilirlik: Değer türleri her seferinde yeni bir kopya oluşturduğundan daha önce nerede kullanıldığı ile ilgilenmez. Referans türlerinde ise son referans gösterdiğimiz değeri bilmemiz gerekir, bu konuda değer türleri daha rahat kullanım sağlar.

Referans Tipinin Avantajları

  • Kalıtım: Referans türlerinde OOP’nin kalıtım özelliğinden yararlanılabilir.

  • Ortak İşlem: Referans türleri hafızada tek bir yer tutar ve bunu gerekirse günceller. Elinizde sürekli olarak aynı veri üzerinden güncellenecek değişken var ise tek bir referans üzerinden kullanmak kolaylık sağlayacaktır.

Kapanış

Bu blogda sizlere değer tipi ve referans tipinin ne olduğunu, arasındaki farkları ve avantajlarını yönlerini anlatmaya çalıştım. Umarım sizler bu blogu okuduktan sonra bu konuyu daha iyi öğrenmiş olursunuz. Aklınıza takılan soru ve feedbackleri bana iletebilirsiniz!