Nedir Bu SwiftUI PropertyWrappers ?
Swift 5.1 ile hayatımıza giren @Property tanımları SwiftUI ile birlikte kullanmaya başladık. Daha önce RXSwift gibi asenkron framework ile UIKit’te sıkça kullanılıyor. Özellikle fonksiyonel kod karmaşasını büyük ölçüde azalttığını söyleyebilirim. Peki gerçek anlamda bu uzaylı gibi görünen değişkenler ne işe yarıyor? Şener ŞEN’in de dediği gibi nedir ula bu faşo ağa?
Tanımladığımız değişkenleri ek bir fonksiyona sokmadan yaratılma anında istediğimiz işlemleri gerçekleştirmek icin kullanıyoruz cevabını size verebilirim. İş hayatımda içinde bulunduğum projeyi SwiftUI ile geliştirmekteyiz. SwiftUI ile beraber yoğun bir şekilde kullandığım property wrapperlara şu şekilde göz atabiliriz;
@State: Bir View’in çizilmesi ile beraber çalışmaya başlar. View hayatta kaldığı süre boyunca @State ekrandaki verileri güncellemeye devam eder. View öldükten sonra oda aynı kaderi paylaşır.
Yukarıdaki görselde olduğu gibi tanımlama yapabiliriz.İsterseniz erişim kısıtlayıcıları ekleyebilirsiniz. Apple state kullanımını private şekilde tanımlamamızı öneriyor.
@Binding: State’in bulunduğu View içinde etkili olduğunu söylemiştik.Eğer başka bir View içinden, içinde bulunduğumuz View de ki @State değişkenini değiştirmek istiyorsak @Binding kullanıyoruz.@Binding ve @State arasındaki en büyük farkı sahiplik olarak söyleyebilirim. @State ile oluşturduğumuz değişkenler sistem tarafından hafızaya alınır.Sahiplik artık @State’e aittir. @Binding ise oluşturulan veri üzerinde okuma ve yazma yetkisine sahiptir. Sahiplik üzerinde hak iddia edemez.
SwiftUI ile beraber Apple MVVM yapısını kullanmamızı öneriyor. Bu yaklaşımla beraber apple ekranlarda kullandığımız yapıları Viewlere bölmemizi istiyor. Örnegin bir textfield login sayfası tasarladığımızı düşünelim. Bu textfield yapısını ayrı bir SwiftUIView dosyasında yaptığımızı varsayalım.
Bu View’deki Textfiel’dan aldığımız name ve tableNo verisini MainViewmiz de ki @State ile tanımladığımız değişkenlere @Binding ile gönderebiliriz.
@ObservedObject: @State ile aralarında akrabalık var diyebilirim. @ObservedObject @State’den farklı olarak tanımlandığı tüm Viewler de çalışmaktadır fakat @ObservedObject tanımlamak için mutlaka dinlediğimiz sınıfın @ObservableObject protokolünü aldığından emin olmalıyız.
ViewModelimizi ObservableObject protokolünden türeterek oluşturduk. Kullanacağımız View de ise aşağıdaki gibi tanımlayabiliriz.
@StateObject: Bazen View içerisinde ObservableObject protokolünden türemiş bir sınıfın nesnesini @ObservedObject ile oluşturduğumuzda tehlikeli olabilir. Tehlikenin nedeni @ObservedObject ‘in bu nesneyi serbest bırakma olasılığı. Bu olasılığı ortadan kaldırmak ve View den gidilecek childViewlere parametre geçişi sağlamak için @StateObject kullanılır. @StateObject View çizimi ile birlikte yaratılacak @ObservedObject nesnesini bize bu View içinde garanti edecek.
ViewModel nesneme default bir değer atamadığım için çağırdığım View de bana soracak heey hemşerim bu modeli verisen verisen niye doldir misan?
MainView’den parametre geçişi yaparak detay sayfasına viewModel’ini vereceğiz. @StateObject yaparak kesinlikle kaybolmayacağını garanti edeceğiz.
@StateObject ve @ObservedObject arasındaki en büyük fark @StateObject’in verileri View’de saklanır, böylece View’in yeniden çizim sırasında verileri kaybetmez. @ObservedObject olarak bildirilmesi farklı bir hikaye olacak. View, verilere sahip olmayacak. View her yeniden çizildiğinde nesnenin yeni bir örneğini oluşturacak. Başka bir deyişle, veriler View de saklanmayacak. View yeniden çizildiğinde, veriler başlangıç değerine sıfırlanacaktır.
@Published:Bir API’niz mi var? API’niz deki verileri saklamak mı istiyorsunuz? Bu sakladığınız dataları ekranlarınızda göstermek mi istiyorsunuz? @Published property wrapper tam size göre. Üstelik sınırsız tanımlama hakkına sahipsiniz.
@Published ile etiketlenmiş nesne bir değişime uğradığında, bu nesneyi kullanan tüm görünümlerin bu değişiklikleri yansıtmak için yeniden yükleneceği anlamına gelir.
Tanımlama şeklini şimdi anlatalım. Buraya girdikmi ufak bir api call yapmak gerekecek.
@EnviromentObject: Projenin tümüne paylaştığınız yapıdır. Projeyi yönettiğiniz Coordinate sınıfında tanımlayıp View içinde @EnviromentObject olarak tanımlamalısınız. Projede View hiyerarşisini yönetmek için önemlidir.
@Enviromentobject ile ekranlarda birçok kontrolü yaptığımızı söylemiştik. \.presentationMode ile ekran kontrolu yapabiliyoruz. Örneğin ekranı dismiss edebiliyoruz. Renk vb gibi birçok kontrolü @Enviromentobject ile yapabiliriz.
Bu makalemde size elimden geldiğince. Dilim döndüğünce SwiftUI property Wrapperları anlatmaya çalıştım. Umarım sizin için verimli ve eğlenceli bir içerik olur. Geri dönüşlerinizi sabırsızlıkla bekliyorum. Kendinize iyi bakın sevgi ile kalın…