Any & AnyObject Types

Bu yazımda şu konuları anlatmaya çalışacağım:

  • Any nedir? Hangi amaçla kullanılmaktadır?
  • Any & AnyObject Kullanım Alanları
  • Swift compiler arka planda neler yapıyor?
  • Any türünden bir değişkenin doğru kullanımı
  • Any bir referans mıdır? Compiler burada nasıl davranır?
  • Any türden diziler tanımlayabilir miyiz?
  • Any ile AnyObject arasında ki fark nedir?

Swift dili geliştirilirken birçok programlama dilinden yararlanılmış. Diğer dillerin dizaynından, sentaks yapısından, iyi yönlerinden faydanılarak oluşturulmuş.

Swift programlama dilinin multi paradigm olduğunu söylemiştik. Yani prosedural, object oriented, functional programlama teknikleri ile uygulama geliştirebiliyoruz.

Java, C# programlama dillerinde herşey en üst sınıf Object’ten oluşmaktadır. C++ dilinde ise böyle bir teknik yoktur. Swift dili burada C++ diline benzemektedir.

Any nedir? Hangi amaçla kullanılmaktadır?

  • Any öncelikle bir türdür.
  • Herhangi türden bir nesneye Any isimli bir türe atayabiliriz.
  • Any türünden nesne yaratamayız. Burada ki çözüm yolu referans bildirmektir çünkü her türden nesne any türünden referansa atanabilir. Hemen örneğe bakalım:

Kodu derlediğimiz zaman hiçbir hata almadığınızı göreceksiniz. Burada dikkatinizi çekmek istediğim bir nokta var. anyTypes isimli Any türüne referans haricinde(class), struct değişkenleride atayabiliyoruz.

Swift compiler bu işlemi nasıl yapıyor?

  • Any türüne bir yapı veya enum atandığı zaman “boxing conversion” yoluyla HEAP alanında bir kopyasını çıkarır.
  • Any referansı artık HEAP alanında ki o kopya değeri gösterir.

Senaryo: Parametresi Any türünden olan bir fonksiyon yazalım. Bu fonksiyonu herhangi türden bir değer ile çağıralım.

Sonuç: Fonksiyonlar Any türünden olabilir ve herhangi türden bir değişken ile çağırabiliriz.

Any türünden bir değişkenin kullanımı

  • Tür dönüşümü yapmadan kullanmamalıyız.
  • Tür dönüşümünü as!(Forced downcasting) yada as?(Conditional downcasting) operatorlerini kullanarak yapabiliriz.

Senaryo: Bir User sınıfı tanımlayalım. Sınıf isim, yaş ve favori programlama dili özelliklerinden oluşsun. Sınıfın display diye bir fonksiyonu olsun. Biz Any türden bir değişkene oluşturduğumuz sınıfı atıp, display fonksiyonuna erişmeye çalışalım.

Sonuç: Hatadan anladığımız gibi Any türünden bir değişkeni direk olarak işleme sokamıyoruz. Tür dönüşümü yapmamız gerekiyor.

Any bir referans mıdır? Compiler burada nasıl davranır?

  • Any bir referanstır.
  • Swift dilinde bir referans HEAP alanında ki bir nesneyi gösterir.
  • Referans ise stack alanında yer alır. Yani bir yapıyı any türünden bir refaransa atadığımızda boxing conversion gerçekleşir. Yukarıda da dediğimiz gibi swift compiler HEAP’te yapı değişkeninin bir kopyasını oluşturur.
  • Any referansı Stack alanındadır ve HEAP alanında ki nesneyi gösterir hale gelir.

Bu söylediğimizi ispatlayan ufak bir kod yazalım.

Sonuç: Bellek adreslerinde de anlaşıldığı gibi aynı nesneyi değil, kopyasını göstermektedir.

Any türden diziler tanımlayabilir miyiz?

  • Any türünden diziler tanımlayabiliriz.
  • Dizileri dolaşırken dikkat etmemiz gereken nokta is operatörü ile dizi elemanlarının türlerini belirlememiz gerekiyor.
  • İstenilirse Any? türünden de referanslar tanımlayabiliriz. Bu sayede referanslara nil atayabiliriz.

Any ile AnyObject arasında ki fark nedir?

Any & AnyObject

Yukarıda ki grafikte herşey çok açık duruyor. AnyObject türüne referans türlerine ilişkin nesneler atayabiliyoruz. Any türüne ise her türden nesne atayabiliyoruz.