2017-02-09 10 views
0
class Actor { 
    let agent: String? = "nobody" 

    init(agent: String){ 
     self.agent = agent // error: immutable value 'self.agent' may only be initialized once 
    } 
} 

let John = Actor(agent: "xyz") 

내가 여기 일어나고있는 순서에 대한 혼란 스러워요 (나는 varlet의 차이점을 충분히 알고 있어요). 하지만 왜 그 오류가 발생합니까? 나는 init 방법을 사용하고있는 경우클래스의 인스턴스가 초기화 될 때 시퀀스는 무엇입니까?

  • , 그 내가 기본 매개 변수를 사용하지 않는 것을 의미하지 않는다?
  • 왜 다른 기본값으로 기본 상수를 변경할 수 없습니까?

답변

2

let 변수를 두 번 이상 할당 할 수는 없지만 정의하고 다시 초기화 할 수는 없습니다. 그런 다음 init 메서드에서 agent 인수의 기본값으로 "nobody"을 사용할 수 있습니다.

class Actor { 
    let agent: String 

    init(agent: String = "nobody"){ 
     self.agent = agent 
    } 
} 

print(Actor().agent) // "nobody" 
print(Actor(agent: "xyz").agent) // "xyz" 

알렉산더 아래 코멘트에 제안한 것처럼 당신이 당신의 init 메소드에 너무 많은 인수가있는 경우, 디폴트 값이 좀 지저분를 얻을 수 있습니다. 기본값을 설정하는 별도의 init 메소드를 만드는 것을 고려하십시오.

class Actor { 
    let agent: String 
    ... 

    init() { 
     self.agent = "nobody" 
     ... 
    } 

    init(agent: String, ...){ 
     self.agent = agent 
     ... 
    } 
} 
+1

그래, 기본값을 설정할 값이 몇 개 밖에없는 경우 분명히 갈 수 있습니다. 2 ~ 3 개 이상인 경우 모든 기본값을 설정하는 매개 변수가없는 별도의 초기화 프로그램을 정의하는 것이 좋습니다. – Alexander

+0

@Alexander 여기 내가 모르는 역설은 속성을 읽거나 읽지 않는다는 것입니다. 만약 당신이 읽고, 그렇다면 내 대답, 내 코드는'let agent : String? '과 같이 실패해야한다. 그렇지 않으면이 라인을 읽는다는 것인가? 왜냐하면 그것은 바보 같기 때문에 기본적으로 무응답으로 여기에 언급 된 바와 같이 붙어 있기 때문입니다 (http://stackoverflow.com/questions/38942325/constant-unassigned-optional-will-not-be-nil-by-default). 기본적으로 예외입니다 ** 만약 당신이 그것을 읽지 않는다면, 나는 오류가 발생해서는 안됩니다. – Honey

+0

@Honey 나는 너의 말을 이해하지 못한다 – Alexander