SwiftUI MVVM小问题从我看到的讲座

  • 本文关键字:我看 MVVM 问题 SwiftUI swift
  • 更新时间 :
  • 英文 :


我在看一个关于Swift中的MVVM和它是如何工作的讲座,我基本上理解模型将包含数据和逻辑,ViewModel将数据传递给视图,可能清理它一点,视图也可以在ViewModel中调用intent函数来通知模型一些需要修改的东西。

现在我知道我没有太多的背景,但这里有很多讲座,我现在没有办法真正解释所有的东西,但基本上我们正在制作一个存储卡游戏,现在我们现在改变它有一个MVVM设计模式(它以前没有)。该模型目前包含一个Card结构和一个选择函数来选择卡片和类似的东西,但由于某种原因,讲师在ViewModel中放置了一组表情符号(游戏中卡片的内容),而不是模型。

我认为模型应该是一个存储数据,而不是ViewModel?有人能解释一下为什么要这么做吗?

ViewModel:

import SwiftUI

class EmojiMemoryGame //this is the ViewModel
{
static let emojis = ["floaf","taco","george","chicken","squeaky","cat","dollar","a","b","c","d","e","f","g","h"] // these are supposed to be the emojis I just used some words instead.
static func createMemoryGame() -> MemoryGame<String>
{
MemoryGame<String>(numbersOfPairsOfCards: 4) { pairIndex  in emojis[pairIndex]}
}
private var model : MemoryGame<String> = createMemoryGame()
var cards: Array<MemoryGame<String>.Card>
{
model.cards
}
}

模型:

import Foundation
struct MemoryGame<CardContent> //MemoryGame is the model for the MVVM pattern
{
private(set) var cards : Array<Card>
func choose(_ card: Card)
{
}
init(numbersOfPairsOfCards: Int, createCardContent: (Int) -> CardContent)
{
cards = Array<Card>()
//add numbersOfPairsOfCards*2 to cards array.
for pairIndex in 0..<numbersOfPairsOfCards
{
let content = createCardContent(pairIndex)
cards.append(Card(content: content))
cards.append(Card(content: content))
}
}
struct Card
{
var isFaceUp: Bool = false
var isMatched: Bool = false
var content: CardContent
}
}

这完全是主观的,MVVM只是一个设计模式,不需要严格遵守。

注意,在MVVM中,给定的视图通常是"backked"一个虚拟机可能与许多不同的模型交互。如果数据要跨视图共享,那么它可能属于某个共享模型。如果数据只在单个视图上使用,那么在VM上可能没有问题。

我也知道你指的是哪一节课。

Model用于存储数据,但VM是中间人,它可以使用Model来计算数据或更新View,而无需让View直接访问Model。当ViewModel从View或User接收到任何特定的交互时,它也会更新Model。您不需要在模型中处理或计算任何数据来更新视图。你必须使用ViewModel

同样,在这种情况下,表情符号"Array并不是真正的主要模型。它只是一个String数组,而不是card数组。emojis用于存储初始化"模型"的数据。把它想象成一个来自用户的输入,你需要把它传递给你的模型,否则,如果你没有任何数据要存储或初始化,你就不需要模型。

主要模型仍然是"Card"one_answers"Card"仍然是完全抽象的

ViewModel的工作是像中间人一样计算数据,然后将其传递给模型或更新视图。此外,ViewModel完全有可能拥有自己的实现变量,以帮助VM和Model或VM和View之间的过程。

总之,模型不做任何处理,计算,直接与视图交互。Model只存储数据。ViewModel完成所有的计算、处理和初始化。

ViewModel是对底层概念的常见错误解释,源于我们在编程语言中缺乏混淆意图的空格。你实际使用的是视图模型,在Swift中可通过View.ModelModel.View表达…

struct CardView: View {
struct Model: DynamicProperty {
extension MemoryGame.Card {
struct View: SwiftUI.View
或者,当它是多个视图而不是一个视图的模型时,它被称为Store:
final class Store: ObservableObject {

尽管MVVM是一个跨平台的术语,苹果基本上拒绝了,但每个视图都有一个模型,不管你是否把它抽象成一个单独的类型。视图模型是视图自己绘制所需的任何东西。在此范围之外的任何内容都是其他内容的模型,不属于该类型。

最新更新