Ios Swift视图模型:功能vs setter,具有副作用
我需要一些关于视图模型架构的意见,在我的项目中,我需要一个用于显示游戏准备状态的屏幕的视图模型,比如说我需要3个以上的玩家来开始游戏,视图模型有一个用于状态的字符串属性,我的视图控制器中有一个从API检索的玩家数组 选项1:Ios Swift视图模型:功能vs setter,具有副作用,ios,swift,mvvm,architecture,viewmodel,Ios,Swift,Mvvm,Architecture,Viewmodel,我需要一些关于视图模型架构的意见,在我的项目中,我需要一个用于显示游戏准备状态的屏幕的视图模型,比如说我需要3个以上的玩家来开始游戏,视图模型有一个用于状态的字符串属性,我的视图控制器中有一个从API检索的玩家数组 选项1: // `gameStatusLabel` is a get property and only set internally when // updating players via function class GameStatusViewModel: NSObject
// `gameStatusLabel` is a get property and only set internally when
// updating players via function
class GameStatusViewModel: NSObject {
private(set) var gameStatusLabel: String
func updatePlayers(players: [Player]?) {
if let players = players, players.count > 3 {
gameStatusLabel = "Ready to start"
} else {
gameStatusLabel = "Not enough player(s)"
}
}
// `gameStatusLabel` is a computed property based on `players.count`
class GameStatusViewModel {
weak var players: [Player]?
var gameStatusLabel: String {
if let players = self.players {
if players.count > 3 {
return "Ready to start"
}
}
return "Not enough player(s)"
}
}
选项2:
// `gameStatusLabel` is a get property and only set internally when
// updating players via function
class GameStatusViewModel: NSObject {
private(set) var gameStatusLabel: String
func updatePlayers(players: [Player]?) {
if let players = players, players.count > 3 {
gameStatusLabel = "Ready to start"
} else {
gameStatusLabel = "Not enough player(s)"
}
}
// `gameStatusLabel` is a computed property based on `players.count`
class GameStatusViewModel {
weak var players: [Player]?
var gameStatusLabel: String {
if let players = self.players {
if players.count > 3 {
return "Ready to start"
}
}
return "Not enough player(s)"
}
}
因为我是Swift的新手,所以我想问一下上面哪个选项更好,为什么?(或者,如果有其他更好的选择)
选项1不在视图模型中存储玩家模型,因为它不需要保留对玩家的引用,而玩家
仅用于更新游戏状态标签
,虽然选项2保持了对玩家的弱引用,并使gameStatusLabel
成为一个计算属性,但这里的问题是选项2中的玩家只需要一个setter,我不知道我是否可以在没有getter的情况下为属性只使用setter(这似乎是选项1的方式)
提前感谢!计算属性的一个问题是,您并不总是知道它们在变化。因此,许多程序员通常不愿在大型项目中使用它们。有关详细信息,请参阅。计算属性的一个问题是,您并不总是知道它们在变化。因此,许多程序员都在变化通常不愿在大型项目中使用它们。有关更多信息,请参阅。在我看来,选项2是更好的方法,但您确实需要使用MVVM绑定框架,以避免@testIn引起的问题。在我看来,选项2是更好的方法,但您确实需要使用MVVM绑定框架,以避免@test提出的问题