首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我在讲座中看到的SwiftUI MVVM小问题

我在讲座中看到的SwiftUI MVVM小问题
EN

Stack Overflow用户
提问于 2022-06-27 23:37:49
回答 3查看 79关注 0票数 1

我在Swift上看了一个关于MVVM的讲座,我基本上明白模型将包含数据和逻辑,ViewModel将数据传递给视图,可能会清理它,视图也可以调用ViewModel中的意向函数,通知模型需要修改的内容。

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

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

ViewModel:

代码语言:javascript
复制
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
    }

}

型号:

代码语言:javascript
复制
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
    }
}
EN

回答 3

Stack Overflow用户

发布于 2022-06-27 23:50:48

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

注意,在MVVM中,给定的视图通常由单个ViewModel“支持”,并且VM可能与许多不同的模型交互。如果数据要跨视图共享,它可能属于某个共享模型。如果数据只是在单个视图上使用,那么在VM上可能会很好。

票数 0
EN

Stack Overflow用户

发布于 2022-06-28 00:05:23

我也知道并明白你指的是哪一堂课。

模型用于存储数据,但是VM是中间人,它可以使用模型计算数据或更新视图,而不允许视图直接访问模型。ViewModel还在收到来自视图或用户的任何特定交互时更新模型。您不处理或计算模型内的任何数据来更新视图。您必须使用ViewModel。

而且,在这种情况下,"emojis“数组实际上不是主要模型。它只是一个字符串数组,而不是“卡片”。emojis用于存储用于初始化“模型”的数据。把它看作是来自用户的输入,您需要将它传递给您的模型,否则,如果您没有任何要存储或初始化的数据,则不需要使用Model。

主要的模式仍然是“卡”,而“卡”在这一语境下仍然是完全抽象的。

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

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

票数 0
EN

Stack Overflow用户

发布于 2022-06-28 02:11:05

ViewModel是对底层概念的一种常见的不正确的解释,这是由于我们在编程语言中缺乏空间,混淆了意图。您实际使用的是一个视图模型,可以通过View.ModelModel.View…在Swift中表达

代码语言:javascript
复制
struct CardView: View {
  struct Model: DynamicProperty {
代码语言:javascript
复制
extension MemoryGame.Card {
  struct View: SwiftUI.View

…或者,当它是几个视图的模型而不是一个视图时,称为Store

代码语言:javascript
复制
final class Store: ObservableObject {

尽管MVVM是一个跨平台的术语,苹果基本上已经拒绝了,但每个视图都有一个模型,不管你是否将它抽象成一个单独的类型。视图模型是视图需要自己绘制的任何东西。这之外的任何东西都是其他东西的模型,不属于这种类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72779304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档