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
}
}
现在,这可能不是正确的模型。也许你