Örnek sorular
Ios Swiftui State RenderingZorluk 1
SwiftUI'de bir view'ın property'sini @State ile işaretlemek gerçekte ne yapar?
- aProperty'yi uygulamadaki her view'dan erişilebilir hale getirir.
- bDeğeri uygulama açılışları arasında kalıcı olarak diske kaydeder.
- cProperty'yi init sonrası asla değişemeyecek şekilde sabitler.
- dDeğerin sahipliğini SwiftUI'ye verir ve değiştiğinde view'ı yeniden çizdirir.✓
Açıklama:@State, bir value type'ın depolamasını view struct'ının kendi ömrünün dışında SwiftUI'ye devreden bir property wrapper'dır; böylece değer tekrar tekrar çağrılan body boyunca korunur ve değiştirildiğinde re-render tetiklenir.
Ios Swiftui State RenderingZorluk 1
SwiftUI'de @Binding'in temel amacı nedir?
- aBir child view içinde değerin bağımsız yepyeni bir kopyasını oluşturmak.
- bBir network yanıtını çevrimdışı kullanım için kalıcı olarak önbelleğe almak.
- cBir child view'a, parent'a ait bir değere okuma-yazma erişimi vermek.✓
- dTüm uygulama genelinde paylaşılan global bir singleton tanımlamak.
Açıklama:@Binding kendi depolamasına sahip değildir; başka bir yerde sahiplenilen state'e geri referanstır, bu sayede child view o değeri okuyup yazabilirken parent (veya orijinal sahip) tek doğru kaynak olarak kalır.
Ios Swiftui State RenderingZorluk 1
Bir parent view @State private var isOn: Bool sahiplenir ve $isOn'u child bir Toggle'a geçirir. Kullanıcı toggle'a dokunur. Ne olur?
- aSadece child view güncellenir; parent'ın sakladığı değer hiç değişmez.
- bUygulama elle yeniden başlatılana kadar hiçbir şey güncellenmez.
- cBinding ayrı bir kopya oluşturur, bu yüzden parent ve child artık değer konusunda uyuşmaz.
- dChild, binding üzerinden yazar ve parent'ın state'ini değiştirir.✓
Açıklama:$ öneki, @State deposundan bir Binding üretir (projects). Bu binding'e yazmak parent'ın gerçek deposuna geri yazar; bu yüzden SwiftUI, bu state'e bağımlı olan parent dahil her view'ın body'sini geçersiz kılıp yeniden çizer.
Ios Swiftui State RenderingZorluk 2
SwiftUI neden @State property'lerinin convention olarak private olmasını ister?
- aÇünkü değeri sadece o view sahiplenmeli ve değiştirmeli.✓
- bÇünkü private property'ler daha hızlı derlenir.
- cÇünkü SwiftUI private olmayan state'i sessizce yok sayar.
- dÇünkü Swift private olmayan property wrapper'ları tamamen yasaklar.
Açıklama:@State yerel, view'a ait depolamayı modeller. private işaretlemek bir convention'dır (katı bir derleyici kuralı değil) ve niyeti pekiştirir: dış kod view'ın iç state'ine doğrudan erişmek yerine geçirilen bir Binding üzerinden etkileşmelidir.
Ios Swiftui State RenderingZorluk 2
Aynı reference-type model bir view'a uygulandığında @ObservedObject ile @StateObject arasındaki temel davranışsal fark nedir?
- a
@ObservedObject Combine publisher'ları destekler, @StateObject desteklemez. - b
@StateObject, instance'ın oluşturulmasını ve ömrünü view'a bağlar.✓ - cİkisi davranışsal fark olmadan tamamen birbirinin yerine geçebilir.
- d
@ObservedObject sadece struct'larla çalışır, class'larla asla çalışmaz.
Açıklama:@StateObject nesneyi view identity'sinin ömrü boyunca (bir kez) tahsis edip canlı tutar. @ObservedObject nesnenin ömrünü kendisi yönetmez — parent view her body değerlendirmesinde yeni bir instance oluşturup geçirirse, gözlemlenen nesne istemeden sıfırlanabilir.
Ios Swiftui State RenderingZorluk 2
Bir view, property üzerinde doğrudan varsayılan değer olarak @ObservedObject var viewModel = ViewModel() tanımlıyor. Parent'ın body'si her yeniden çalıştığında sessizce yepyeni bir ViewModel instance'ı oluşuyor. Doğru düzeltme nedir?
- aViewModel'i class instance'ının etrafına ekstra bir
@State var ile sarmak. - bWrapper'ı
@StateObject var viewModel = ViewModel() yapmak.✓ - cVarsayılan değer init ifadesini bunun yerine
onAppear içine taşımak. - dÖmür sorununu çözmek için ViewModel sınıfını
final işaretlemek.
Açıklama:Bu bug, klasik bir '@ObservedObject + varsayılan değer' hatasıdır: @ObservedObject ömrü yönetmediği için, struct her yeniden oluşturulduğunda default init ifadesi tekrar çalışır. @StateObject tam olarak bu ilk oluşturmayı sahiplenip aynı instance'ı canlı tutmak için vardır.