Bạn không nên. Đó là một quan niệm sai lầm phổ biến rằng SwiftUI hoạt động tốt nhất với MVVM.
MVVM không có chỗ trong SwfitUI. Bạn đang hỏi rằng nếu bạn có thể đẩy một hình chữ nhật đến
phù hợp với một hình tam giác. Nó sẽ không phù hợp.
Hãy bắt đầu với một số sự kiện và từng bước làm việc:
ViewModel là một mô hình trong MVVM.
MVVM không xem xét loại giá trị (ví dụ: không có điều đó trong java).
Mô hình kiểu giá trị (mô hình không có trạng thái) được coi là an toàn hơn tham chiếu
loại mô hình (mô hình với trạng thái) theo nghĩa bất biến.
Bây giờ, MVVM yêu cầu bạn thiết lập một mô hình theo cách mà bất cứ khi nào nó thay đổi, nó
cập nhật xem theo một số cách xác định trước. Điều này được gọi là ràng buộc.
Không ràng buộc, bạn sẽ không có sự phân chia mối quan tâm tốt đẹp, ví dụ; tái cấu trúc
mô hình và các trạng thái liên quan và giữ chúng tách biệt khỏi tầm nhìn.
Đây là hai điều mà hầu hết các nhà phát triển MVVM của iOS thất bại:
iOS không có cơ chế "ràng buộc" theo nghĩa java truyền thống.
Một số người sẽ bỏ qua sự ràng buộc và nghĩ rằng việc gọi một đối tượng ViewModel
tự động giải quyết mọi thứ; một số sẽ giới thiệu Rx dựa trên KVO và
làm phức tạp mọi thứ khi MVVM được cho là làm cho mọi thứ đơn giản hơn.
mô hình với nhà nước là quá nguy hiểm
bởi vì MVVM tập trung quá nhiều vào ViewModel, quá ít về quản lý nhà nước
và các quy tắc chung trong việc quản lý Kiểm soát; hầu hết các nhà phát triển kết thúc
nghĩ rằng một mô hình với trạng thái được sử dụng để cập nhật chế độ xem có thể tái sử dụng và
kiểm tra .
đây là lý do Swift giới thiệu loại giá trị ở vị trí đầu tiên; một mô hình mà không có
tiểu bang.
Bây giờ với câu hỏi của bạn: bạn hỏi liệu ViewModel của bạn có thể có quyền truy cập vào Môi trường môi trường (EO) không?
Bạn không nên. Bởi vì trong SwiftUI, một mô hình phù hợp với Chế độ xem tự động có
tham chiếu đến EO. Ví dụ;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Tôi hy vọng mọi người có thể đánh giá cao cách thiết kế SDK nhỏ gọn.
Trong SwiftUI, MVVM là tự động . Không cần một đối tượng ViewModel riêng biệt
mà liên kết thủ công để xem yêu cầu tham chiếu EO được truyền cho nó.
Đoạn mã trên là MVVM. Ví dụ; một mô hình với ràng buộc để xem.
Nhưng vì mô hình là loại giá trị, nên thay vì tái cấu trúc mô hình và trạng thái như
xem mô hình, bạn tái cấu trúc kiểm soát (ví dụ trong phần mở rộng giao thức).
Đây là mẫu thiết kế thích ứng SDK chính thức với tính năng ngôn ngữ, thay vì chỉ
thi hành nó Chất trên hình thức.
Nhìn vào giải pháp của bạn, bạn phải sử dụng singleton về cơ bản là toàn cầu. Bạn
nên biết nguy hiểm như thế nào khi truy cập toàn cầu ở bất cứ đâu mà không cần bảo vệ
tính bất biến mà bạn không có vì bạn phải sử dụng mô hình kiểu tham chiếu!
TL; DR
Bạn không làm MVVM theo cách java trong SwiftUI. Và cách Swift-y để làm điều đó là không cần thiết
để làm điều đó, nó đã được tích hợp sẵn.
Hy vọng nhiều nhà phát triển thấy điều này vì đây dường như là một câu hỏi phổ biến.