Yapmamalısın. SwiftUI'nin MVVM ile en iyi şekilde çalıştığı yaygın bir yanlış anlamadır.
MVVM'nin SwfitUI'de yeri yok. Bir dikdörtgen dikebiliyorsanız,
bir üçgen şekli sığdırmak. Uygun olmaz.
Bazı gerçeklerle başlayalım ve adım adım çalışalım:
ViewModel, MVVM'de bir modeldir.
MVVM, değer türünü (örneğin; java'da böyle bir şey yok) dikkate almaz.
Bir değer tipi model (durumsuz model) referanstan daha güvenli kabul edilir
değişmezlik anlamında tip modeli (durumlu model).
Şimdi, MVVM, her değiştiğinde,
görünümü önceden belirlenmiş bir şekilde günceller. Bu bağlama olarak bilinir.
Bağlanma olmadan, endişelerin hoş bir şekilde ayrılması olmaz, örneğin; yeniden düzenleme
ve ilişkili durumları modellemek ve bunları görünümden ayrı tutmak.
Çoğu iOS MVVM geliştiricisinin başarısız olduğu iki şey şunlardır:
iOS'un geleneksel java anlamında "bağlayıcı" bir mekanizması yoktur.
Bazıları sadece bağlamayı görmezden gelir ve ViewModel nesnesini çağırmayı düşünür
her şeyi otomatik olarak çözer; bazıları KVO tabanlı Rx'i tanıtır ve
MVVM'nin işleri daha basit hale getirmesi gerektiğinde her şeyi karmaşık hale getirir.
durumlu model çok tehlikeli
çünkü MVVM ViewModel'e çok fazla, devlet yönetimine çok az önem verdi
ve Kontrol yönetimindeki genel disiplinler; geliştiricilerin çoğu
görünümü güncellemek için kullanılan durumu olan bir modeli yeniden kullanmak ve
test edilebilir .
bu yüzden Swift ilk etapta değer türünü ortaya koyuyor; olmayan bir model
durum.
Şimdi sorunuza bakın: ViewModel'inizin EnvironmentObject'e (EO) erişip erişemeyeceğini mi soruyorsunuz?
Yapmamalısın. Çünkü SwiftUI'de View'a uygun bir model otomatik olarak
EO referansı. Örneğin;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Umarım insanlar kompakt SDK'nın nasıl tasarlandığını takdir edebilirler.
SwiftUI'de MVVM otomatiktir . Ayrı bir ViewModel nesnesine gerek yoktur
manuel olarak bağlanan ve ona iletilen bir EO referansı gerektiren.
Yukarıdaki kod olan MVVM. Örneğin; görüntülemek için bağlama ile bir model.
Ancak model değer türü olduğundan, modeli ve durumu yeniden düzenlemek yerine
görünümü modeli, kontrol refactor dışarı (örneğin, protokol uzantısı).
Bu, tasarım desenini sadece dil özelliklerine uyarlayan resmi SDK'dır.
zorlamak. Özün önceliği.
Çözümünüze bakın, temelde küresel olan singleton kullanmanız gerekir. Sen
koruması olmadan herhangi bir yere küresel erişimin ne kadar tehlikeli olduğunu bilmeli
referans tip model kullanmak zorunda olduğunuz için sahip olmadığınız değişmezlik!
TL; DR
SwiftUI'de MVVM'yi java olarak yapmazsınız. Ve bunu yapmanın Swift-y yolu gerekmiyor
Bunu yapmak için zaten yerleşik.
Umarım daha fazla geliştirici bunu görür çünkü bu popüler bir soru gibi görünüyordu.