我一直遇到同样的问题。在下面的代码中,我会收到一个错误,因为我在初始化类的所有属性之前运行了makePlayersFrom。
我可以将玩家作为一个可选变量,但它不应该是,我认为这将是糟糕的设计。我也可以将makePlayers功能放在init类中,但我觉得这也是糟糕的设计(不过我不知道最好的人)。有人能告诉我如何保持最好的设计原则吗?
class Game {
let host:User
var players:[Player]
init(host:User, extraPlayers:Int) {
self.host = host
self.players = makePlayersFrom(host:host, extraPlayers:extraPlayers)
}
private func makePlayersFrom(host:User, extraPlayers:Int) -> [Player] {
// do stuff to get players
return players
}
}
答案 0 :(得分:2)
根据Apple文档,您违反了两阶段初始化4:
安全检查4 - 初始化程序无法调用任何实例方法,读取任何实例属性的值,或者在初始化的第一阶段完成之后将self作为值引用。
对于这种情况,我建议将makePlayersFrom
转换为类方法:
private class func makePlayersFrom(...)
并将其从初始化程序中调用为self. players = Game.makePlayersFrom(...)
只要makePlayersFrom
没有访问实例变量,它应该可以正常工作。