2017-02-13 9 views
1

私は同じ問題を抱えています。以下のコードでは、クラスのすべてのプロパティを初期化する前にmakePlayersFromを実行しているのでエラーが発生します。Swift:initメソッドに機能を追加する方法

私は選手をオプションの変数として置くことができますが、そうでないと悪い設計になると思います。私はinitクラスにmakePlayers機能を追加することもできますが、それも悪い設計であると感じています(しかし、私は誰にも分かりません)。最高のデザインプリンシパルでこれを維持する方法を誰にでも教えてもらえますか?

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

安全チェック - 初期化子は、任意のインスタンスプロパティの値を読んで、任意のインスタンスメソッドを呼び出す、または参照することはできません 初期化の第1フェーズが完了するまで値として自己に変換します。

この場合のために、私は、クラスメソッドにmakePlayersFromを変換することをお勧め:

private class func makePlayersFrom(...)

そして、それが必要インスタンス変数にアクセスしていない限りmakePlayersFromとしてself. players = Game.makePlayersFrom(...)

として初期化子からそれを呼び出しますうまく動作します。

関連する問題