คุณไม่ควร มันเป็นความเข้าใจผิดทั่วไปที่ SwiftUI ทำงานได้ดีที่สุดกับ MVVM
MVVM ไม่มีสถานที่ใน SwfitUI คุณจะถามว่าถ้าคุณสามารถผลักสี่เหลี่ยมผืนผ้า
พอดีกับรูปสามเหลี่ยม มันไม่พอดี
เริ่มจากข้อเท็จจริงและงานทีละขั้นตอน:
ViewModel เป็นรูปแบบใน MVVM
MVVM ไม่นำค่าประเภท (เช่นไม่มีสิ่งใดใน java) มาพิจารณา
รูปแบบประเภทค่า (รุ่นที่ไม่มีสถานะ) ถือว่าปลอดภัยกว่าการอ้างอิง
type model (model with state) ในแง่ของความไม่เปลี่ยนแปลง
ตอนนี้ MVVM ต้องการให้คุณตั้งค่ารูปแบบในแบบที่ทุกครั้งที่มีการเปลี่ยนแปลง
มุมมองการปรับปรุงในบางวิธีที่กำหนดไว้ล่วงหน้า สิ่งนี้เรียกว่าการรวม
คุณจะไม่มีข้อกังวลที่ดีเช่น; refactoring out
รูปแบบและสถานะที่เกี่ยวข้องและทำให้พวกเขาแยกจากมุมมอง
นี่คือสองสิ่งที่นักพัฒนา iOS MVVM ส่วนใหญ่ล้มเหลว:
iOS ไม่มีกลไก "ผูกมัด" ในความหมายของจาวาแบบดั้งเดิม
บางคนก็ไม่สนใจการเชื่อมโยงและคิดว่าการเรียกใช้ ViewModel ของวัตถุ
แก้ปัญหาทุกอย่างโดยอัตโนมัติ บางคนจะแนะนำ Rx ที่ใช้ KVO และ
ซับซ้อนทุกอย่างเมื่อ MVVM ควรจะทำให้สิ่งต่าง ๆ ง่ายขึ้น
โมเดลที่มีสถานะเป็นอันตรายเกินไป
เนื่องจาก MVVM ให้ความสำคัญกับ ViewModel มากเกินไปน้อยเกินไปในการจัดการสถานะ
และสาขาวิชาทั่วไปในการจัดการการควบคุม; นักพัฒนาส่วนใหญ่จะจบลง
การคิดแบบจำลองที่มีสถานะที่ใช้ในการอัปเดตมุมมองนั้นสามารถนำมาใช้ซ้ำได้และ
ทดสอบทดสอบ
นี่คือสาเหตุที่ Swift แนะนำประเภทค่าในตอนแรก รูปแบบที่ไม่มี
สถานะ.
ตอนนี้สำหรับคำถามของคุณ: คุณถามว่า ViewModel ของคุณสามารถเข้าถึง EnvironmentObject (EO) ได้หรือไม่?
คุณไม่ควร เพราะใน SwiftUI รุ่นที่สอดคล้องกับ View จะมีโดยอัตโนมัติ
อ้างอิงถึง EO เช่น;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
ฉันหวังว่าผู้คนจะพึงพอใจกับการออกแบบ SDK ที่กะทัดรัด
ใน SwiftUI, MVVM เป็นอัตโนมัติ ไม่จำเป็นต้องมีวัตถุ ViewModel แยกต่างหาก
ที่ผูกไว้เพื่อดูด้วยตนเองซึ่งต้องมีการอ้างอิง EO ผ่านไป
รหัสข้างต้นคือ MVVM เช่น; โมเดลที่มีการเชื่อมโยงเพื่อดู
แต่เนื่องจากตัวแบบเป็นประเภทค่าดังนั้นแทนที่จะปรับเปลี่ยนโมเดลและสถานะเป็น
มุมมองรูปแบบคุณ refactor out control (ตัวอย่างเช่นในส่วนขยายโปรโตคอล)
นี่คือ SDK อย่างเป็นทางการที่ปรับรูปแบบการออกแบบให้เป็นภาษาไม่ใช่แค่
บังคับใช้มัน สารมากกว่าแบบฟอร์ม
ดูวิธีแก้ปัญหาของคุณคุณต้องใช้ซิงเกิลตันซึ่งเป็นพื้นโลก คุณ
ควรรู้ว่าการเข้าถึงทั่วโลกนั้นอันตรายแค่ไหนโดยไม่ได้รับการคุ้มครอง
เปลี่ยนไม่ได้ซึ่งคุณไม่ได้เพราะคุณต้องใช้รูปแบบประเภทอ้างอิง!
TL; DR
คุณไม่ได้ทำ MVVM ด้วยวิธีจาวาใน SwiftUI และวิธีที่รวดเร็วในการทำก็ไม่จำเป็น
ที่จะทำมันมีอยู่แล้วในตัว
หวังว่านักพัฒนาซอฟต์แวร์จะเห็นสิ่งนี้ตั้งแต่นี้ดูเหมือนจะเป็นคำถามยอดนิยม