Swift | Properties

cemal tüysüz
4 min readDec 11, 2022

Herkese selamlar, bu yazımda swift de property nedir ? Property çeşitleri, lazy property, property observers ve en son olarak da property wrappers konularına değineceğiz. Keyifli okumalar dilerim :)

Property

Bir sınıf veya yapıda depoladığımız değerlere property diyoruz. Az buçuk swift ile kodlama yaptıysanız property de kullanmışsınızdır aslında. Oluşturulan herhangi bir çeşitte değişken veya sabit birer property dir.

Stored ve Computed olmak üzere iki çeşit property vardır.

Stored Property

Oluşturduğunuz yapı bir değişken veya sabitte olup değer biz erişiyor veya erişmiyorken bellekte tutuluyorsa bu stored property dir.

Aşağıdaki kodu inceleyelim:

11 ve 12. satırlarda basic iki adet stored property görüyorsunuz. Bu propertyler class oluştuğunda direkt olarak hafızada tutulmaya başlanırlar. Biz herhangi bir tanesine erişmek istediğimizde o an hafızadaki değeri bize getirilir.

Stored property kullanımı ile ilgili ikinci örneğimizi inceleyelim :

Satır 4 de tanımlanmış başka bir stored property görüyoruz. Human değişkenine her erişmeye çalıştığımızda ismi “Adam” veya cinsiyeti “Male” verilmeyecektir. Human değişkeninin oluşturulması için açılan parantezler sınıf ilk oluşturulurken tek bir sefer çalışır.

Satır 13 de human nesnesinin isim ve cinsiyet bilgisi yazdırılıyor. Eğer run fonksiyonu ilk defa çalıştırılıyorsa isim ve cinsiyet bilgisi değiştirilmediği için çıktı satır 31 deki gibi olacaktır. Lakin satır 15 ve 16 da bu özellikler değiştirildiği için bir sonraki erişim ve yazdırmada çıktı daha farklı olacaktır.

Lazy Stored Property

Bir stored property nin başına lazy keyword u eklenirse bu property sınıf ilk oluşturulurken create edilmez. Sistem sınıfın oluşma aşamasında değişkenleri tarayıp belleğe alırken başında lazy gördüğü propertyleri es geçer yani. E peki bu property ne zaman create ediliyor ? diye sorarsanız bunu cevabı değişkene ilk erişimde olacaktır. Ne zaman lazy anahtarı ile yazılmış bir property e erişmeye kalkarsanız o zaman create edilip belleğe yazılır.

Aşağıdaki örneği inceleyelim :

Gezegen sınıfımızı oluşturulurken satır 25 de bir kontrol gerçekleştiriyoruz. Eğer bu gezegen dünya ise insanlar listesi içerisine iki adet insan oluşturup eklemesini yapıyoruz.

Burada önemli kısım insanların lazy anahtar kelimesine sahip olmasıdır. Yani ben bu insanlara erişene kadar bu insanlar hiç oluşmayacaklar. Gezegen dünya değilde mars olsaydı ve lazy anahtarını kullanmasaydık bu insanlar gezegen oluşurken aynı anda create edileceklerdi. Listede olmadıkları halde bellekte yer kaplayacaklardı.

Bilgilendirme: Swift de yer alan extensionlar bellek mimarisinde değişiklik yapamazlar. Dolayısı ile bir stored property ancak o sınıfın kendisinde tanımlanabilir. Bir extension içerisinde stored property bulunamaz.

Computed Property

Bu property çeşidi ise aynı bir fonksiyon gibi çalışır. Ne zaman çağırılırsa o zaman bir sonuç döndürür.

Aşağıdaki örneği inceleyelim :

Satır 7 de human bir computed property olarak tanımlandığı için her çağrıldığında o an ki humanName ve humanGender okunarak bir fonksiyon gibi yeni bir human nesnesi çıktısı veriyor.

get-set bloklarını computed property ler de alırlar. Lakin buradaki durum stored property e göre daha farklıdır. Stored property de get ve set işlevleri tetiklendiğinde okunan ve yazılan değer o property nin hafızadaki karışılığıydı ama bu durumda computed property nin hafızada bir karşılığı olmadığı için get ve set işlevlerinin etki alanları başka değişken veya sabitler oluyor.

Property Observers

Bir property e yeni bir değer ataması yapılmadan önce veya yapıldıktan sonra bu durumlardan haberdar olayım diyorsanız bu yapı sizler için birebir.

Aşağıdaki kod yapısını inceleyelim :

Satır 4 ve satır 9 da iki farklı property observer tanımlandı. Satır 4 de yer alan willSet yeni bir değer ataması gerçekleşeceği zaman tetikleniyor. Bu scope içerisinde newValue ile gelecek olan yeni değeri algılayabiliyorsunuz. Satır 9 da ise didSet observer i yeni bir değer atamasi yapildiginda gerceklesiyor. Bu kısımda da oldValue ile eski değeri elde edebiliyoruz.

Property Wrappers

Bir property wrapper herhangi bir property nin öncesinde tanımlandığında o property e kendi özelliklerini aktarır. Örneğin String tipinde bir değişkenim var ve bu değişkenin hafızadaki karşılık değerinin hep büyük karakterli tutulmasını istiyorum.

O vakit aşağıdaki property wrapper benim işimi görecektir :

Satır 2 de upperCased diye bir struct oluşturdum. Bunun bir wrapper olduğunu belirtmek için @propertyWrapper anahtarını ekledim. Bu sınıfın içerisindeki wrappedValue ise wrapper in yazılacağı property i işaret ediyor.

Information adında bir sınıf oluşturup içine name ve city olmak üzere iki adet property ekledim. City property sinin büyük karakterli olmasını istediğim için @Uppercased wrapper ini yazdım. Wrapped value kısmında belirttiğim didSet olunca değerin karakterlerini büyüt gibi özellikle otomatik olarak city propertysine aktarıldı gibi düşünebilirsiniz.

Aşağıdaki farklı bir örneğe bakalım:

Bu PropertyWrapper da ise wrap edilen property default olarak UUID string değerini alıyor. Böylelikle bir ID yi temsil edecek propertylerde tek tek id atamasını gerçekleştirmiyor olacağız.

Devamında ise Transaction adında bir sınıf ve transactionId adında bir değişken oluşturdum. Bu değişken @Id property wrapper ini aliyor. Bu sayede bu değişken oluştuğu gibi ona bir adet String UUID veriliyor.

Umarım bilgilendirici ve keyifli bir yazı olmuştur. Bir başka yazıda görüşmek üzere. Sağlıcakla kalın.

Kaynakça :

Swift docs

--

--