Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 创建MVC模型类的最佳实践_Ios_Swift_Oop_Model View Controller - Fatal编程技术网

Ios 创建MVC模型类的最佳实践

Ios 创建MVC模型类的最佳实践,ios,swift,oop,model-view-controller,Ios,Swift,Oop,Model View Controller,我将创建一个自己版本的扫雷游戏,我想知道,创建一类手机游戏的最佳方式是什么 我有两个版本: 一, 二, 哪一种是更好的OOP或MVC编码方式?如果您在ViewController中创建这些GameCell,我认为GameCell的本质是一个接受用户交互的按钮,它会以更新游戏板来响应。因此,我要说,第一种方法似乎更合理 但是如果您在模型中创建GameCells,然后使用它们来创建UI,我相信您可能会使用第二种方法,但是如果您在ViewController中创建这些GameCells,您的GameC

我将创建一个自己版本的扫雷游戏,我想知道,创建一类手机游戏的最佳方式是什么

我有两个版本:

一,

二,


哪一种是更好的OOP或MVC编码方式?

如果您在ViewController中创建这些
GameCell
,我认为
GameCell
本质是一个接受用户交互的按钮,它会以更新游戏板来响应。因此,我要说,第一种方法似乎更合理


但是如果您在模型中创建
GameCell
s,然后使用它们来创建UI,我相信您可能会使用第二种方法,但是如果您在ViewController中创建这些
GameCell
s,您的
GameCell
应该是
按钮的属性,我认为
GameCell
本质是一个按钮,它接受用户交互,并通过更新游戏板来响应。因此,我要说,第一种方法似乎更合理


但是如果您在模型中创建
GameCell
s,然后使用它们来创建UI,我相信您可能会使用类似于第二种方法的东西,但是您的
GameCell
应该是
按钮的属性

我不推荐这两种模式中的任何一种

一个模型应该没有任何视图引用(即,它应该没有UIKit引用)。你不想把你的视图(比如你在屏幕上看到的按钮、图像、chrome等等)和模型(整个电路板的抽象表示,表示哪些方块有炸弹,哪些没有,哪些方块仍然隐藏,哪些方块没有隐藏)

FWIW,我个人也倾向于将
bombCountAround
属性留给
Board
为给定行和列计算的属性。它实际上不是任何给定正方形的属性,而是各个正方形之间的关系。理论上,你可以有一个属性来捕获它,以避免在运行中重新计算它,但是查看周围八个单元格的计算开销是如此之小,以至于真的没有必要


举个例子,我可能在黑板上有一个特定正方形的对象:

struct Square {
    var isBomb: Bool
    var isHidden: Bool
    var hasUserFlagged: Bool
}
这个模型代表了我们在创建视图时需要了解的关于单元的所有信息。具体来说,广场是否真的是炸弹,广场是否仍然隐藏(例如,用户根本没有点击它),或者用户是否在那里插了一面旗帜,表示他们认为那里是否有炸弹

顺便说一下,请注意,我没有在模型名称中的任何位置使用
单元格
,因为这通常意味着UIKit对象,例如集合视图单元格。模型不应该担心视图的实现(即,您是使用集合视图单元格,还是仅使用堆栈视图中的按钮,或者仅使用带约束的图像视图)。而
Cell
意味着一种视觉元素,而不是电路板上的抽象正方形

话虽如此,我们可能需要一个结构来代表所有这些方块的整个棋盘,可能是一个代表整个游戏棋盘的
棋盘

struct Board {
    private var squares: [[Square]]

    init(width: Int, height: Int, bombCount: Int) {
        // build the squares array of array of `Square`, setting a certain number to have bombs
    }
}

extension Board {
    func isBomb(column: Int, row: Int) -> Bool {
        // look up to see if the `Square` at that row and column is a bomb or not
    }

    func howManyBombsNear(column: Int, row: Int) -> Int {
        // calculate how many nearby bombs there are
    }
}
现在,这可能不是正确的模型。也许你想把炸弹在哪里的初始设置从游戏时间统计中分离出来,关于用户未隐藏的内容和有标志的内容。这取决于你


但需要注意的是,模型应该完全没有任何与视图相关的类型。视图完全从模型中抽象出来,因此您可以根据需要为相关平台实现此功能(例如,您的非Catalyst macOS目标可能使用与您的iOS/iPadOS/tvOS目标完全不同的视图集)。

我不推荐这两种模式中的任何一种

一个模型应该没有任何视图引用(即,它应该没有UIKit引用)。你不想把你的视图(比如你在屏幕上看到的按钮、图像、chrome等等)和模型(整个电路板的抽象表示,表示哪些方块有炸弹,哪些没有,哪些方块仍然隐藏,哪些方块没有隐藏)

FWIW,我个人也倾向于将
bombCountAround
属性留给
Board
为给定行和列计算的属性。它实际上不是任何给定正方形的属性,而是各个正方形之间的关系。理论上,你可以有一个属性来捕获它,以避免在运行中重新计算它,但是查看周围八个单元格的计算开销是如此之小,以至于真的没有必要


举个例子,我可能在黑板上有一个特定正方形的对象:

struct Square {
    var isBomb: Bool
    var isHidden: Bool
    var hasUserFlagged: Bool
}
这个模型代表了我们在创建视图时需要了解的关于单元的所有信息。具体来说,广场是否真的是炸弹,广场是否仍然隐藏(例如,用户根本没有点击它),或者用户是否在那里插了一面旗帜,表示他们认为那里是否有炸弹

顺便说一下,请注意,我没有在模型名称中的任何位置使用
单元格
,因为这通常意味着UIKit对象,例如集合视图单元格。模型不应该担心视图的实现(即,您是使用集合视图单元格,还是仅使用堆栈视图中的按钮,或者仅使用带约束的图像视图)。而
Cell
意味着一种视觉元素,而不是电路板上的抽象正方形

话虽如此,我们可能需要一个结构来代表所有这些方块的整个棋盘,可能是一个代表整个游戏棋盘的
棋盘

struct Board {
    private var squares: [[Square]]

    init(width: Int, height: Int, bombCount: Int) {
        // build the squares array of array of `Square`, setting a certain number to have bombs
    }
}

extension Board {
    func isBomb(column: Int, row: Int) -> Bool {
        // look up to see if the `Square` at that row and column is a bomb or not
    }

    func howManyBombsNear(column: Int, row: Int) -> Int {
        // calculate how many nearby bombs there are
    }
}
现在,这可能不是正确的模型。也许你