2017-02-13 7 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

안전 검사 - 이니셜이 인스턴스의 속성 값을 읽어, 인스턴스 메소드를 호출하거나 참조 할 수 없습니다 초기화의 첫 번째 단계가 완료 될 때까지 값으로 self합니다.

이때 들어 I 클래스 방법으로 makePlayersFrom 변환 제안 :

private class func makePlayersFrom(...)

그리고 정상적으로 인스턴스 변수를 액세스하지만큼 makePlayersFrom 같은 self. players = Game.makePlayersFrom(...)

로서 초기화에서 호출 잘 작동합니다.

관련 문제