2017-02-13 45 views
1

我不斷遇到同樣的問題。在下面的代碼中,我會得到一個錯誤,因爲我在初始化該類的所有屬性之前運行了makePlayersFrom。Swift:如何添加功能到初始化方法

我可以把玩家作爲一個可選變量,但它不應該是,我認爲這將是糟糕的設計。我也可以把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 
    } 
} 

回答

2

根據您違反了蘋果的文檔兩階段初始化數4:

安全檢查4 - 一個初始化不能調用任何實例方法,讀取任何實例屬性的值,或參考直到初始化的第一階段完成之後纔將自己當作值。

對於這種情況,我建議將makePlayersFrom成類方法:

private class func makePlayersFrom(...)

而且從初始化稱其爲self. players = Game.makePlayersFrom(...)

只要makePlayersFrom沒有訪問它應該實例變量工作很好。