Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 Swift视图模型:功能vs setter,具有副作用_Ios_Swift_Mvvm_Architecture_Viewmodel - Fatal编程技术网

Ios Swift视图模型:功能vs setter,具有副作用

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

我需要一些关于视图模型架构的意见,在我的项目中,我需要一个用于显示游戏准备状态的屏幕的视图模型,比如说我需要3个以上的玩家来开始游戏,视图模型有一个用于状态的字符串属性,我的视图控制器中有一个从API检索的玩家数组

选项1:

// `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提出的问题