SwiftUI: @Published
SwiftUI’da veri transferi için en çok kullanılan “property wrapper”lardan biri olan @Published elemanını nasıl kullanabileceğinizi öğrenin!
SwiftUI ve Combine gibi Apple’ın yeni tanıttığı teknolojiler ile birlikte “reactive” programlama Apple platformlarında uygulama geliştiricileri arasında gittikçe daha da popülerleşiyor. Bu makalede de SwiftUI ile veri akışı oluştururken işimize fazlasıyla yarayan -ve “reactive” programlamayı anımsatan- @Published
“property wrapper”ını inceleyeceğiz.
@Published
“property wrapper”ı SwiftUI’da en çok kullanılan araçlardan biridir: Onun sayesinde UI elemanlarının içerisindeki değerleri anlık olarak değiştirebiliyoruz.
@Published
elemanı WWDC19’da SwiftUI’ın tanıtılmasından bu yana kullanılıyor ama aradan geçen iki senelik sürede hem Apple’ın yaptığı geliştirmeler hem de üçüncü parti geliştiricilerin ve toplulukların bu elemanı en iyi şekilde nasıl kullanabileceğimize dair içerikleriyle kullanım alanları genişledi.
SwiftUI’ın protokol tabanlı programlamaya pek uygun olmaması sebebiyle SwiftUI uygulamaları geliştirirken tanımladığımız veri yapıları için @Published
elemanını kullanmak şart oluyor.
İlerleyen makalelerde @Published
“property wrapper”ının bütün kullanım alanlarına değiniyor olacağız.
İlk önce en basitten başlayalım. Makalenin başında @Published
ile tanımlanan değerlerin UI elemanlarında anlık olarak değiştirildiğinden bahsetmiştim. Yani bu değerler her değişikliğe uğradığında bu değeri kullanan bütün UI elemanları yeniden çiziliyorlar.
Örnek olarak bir tane ObservableObject
protokolünü kullanan bir obje oluşturalım ve onun içine bir değişken tanımlayalım.
class Team: ObservableObject {
// MARK: - Properties
var teamMemberCount = 0
}
ObservableObject
protokolünü kullanmamızın sebebi, “Team” objesini bir View
yapısının içerisinde tanımlayacağımızda o View
yapısının sürekli olarak o tanımladığımız objeyi dinlemesini sağlamaktır. Yalnız, teamMemberCount
değişkenini şu an bir body
değerinin içerisinde kullanırsak ve bu değişkenin değerini değiştirirsek -örneğin teamMemberCount
değerini 1’e yükseltelim- UI içerisinde hiçbir değişiklik göremeyiz.
struct ContentView: View {
// MARK: - Properties
@ObservedObject var team = Team()
// MARK: - View
var body: some View {
VStack {
Text("\(team.teamMemberCount)")
Button("Increase Team Member Count") {
team.teamMemberNames += 1
}
}
}
}
İşte bu yüzden teamMemberCount
değişkeninde @Published
elemanını kullanmalıyız. Böylece teamMemberCount
değişkeninin değerini değiştirdiğimiz an UI objelerimiz de değişmiş olacaktır.
class Team: ObservableObject { // MARK: - Properties
@Published var teamMemberCount = 0
}
Başka bir şey yapmanıza gerek yok–@Published
elemanı, tanımlanmış olduğu değişkenlere bir willSet
“property observer”ı ekler, böylece değişiklikler otomatik olarak UI elemanlarına gönderilir.
Görebildiğiniz gibi, @Published
elemanı isteğe bağlıdır-varsayılan değişkenler kendiliğinden yenilenmediğinden anlık olarak değişmesini istediğiniz özelliklerinizi @Published
ile tanımlamalısınız. Bu demek oluyor ki @Published
depolama için de kullanılabilir. İlerleyen yazılarımızda buna değineceğiz.