Swift:如何向init方法添加功能

时间:2017-02-13 19:26:42

标签: swift xcode initialization

我一直遇到同样的问题。在下面的代码中,我会收到一个错误,因为我在初始化类的所有属性之前运行了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
    }
}

1 个答案:

答案 0 :(得分:2)

根据Apple文档,您违反了两阶段初始化4:

  

安全检查4 -   初始化程序无法调用任何实例方法,读取任何实例属性的值,或者在初始化的第一阶段完成之后将self作为值引用。

对于这种情况,我建议将makePlayersFrom转换为类方法:

private class func makePlayersFrom(...)

并将其从初始化程序中调用为self. players = Game.makePlayersFrom(...)

只要makePlayersFrom没有访问实例变量,它应该可以正常工作。