2014-07-16 1 views
1

self를 사용하여 subviewGroup 속성을 초기화하고 싶지만 다음과 같은 오류가 있습니다. 'self.gridView'속성이 super.init에서 초기화되지 않았습니다. 내가 알고신속하게 나는 super.init() 이전에 초기화 할 수 없습니다.

'자기'는 super.init 호출 이전에 사용 :이

init(frame: NSRect) { 
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
    super.init(frame: frame) 
} 

/*** Properties ***/ 
let subviewGroup: GridViewGroup 

같은 초기화 후에는 super.init()를 넣어 경우

init(frame: NSRect) { 
    super.init(frame: frame) 
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
} 

/*** Properties ***/ 
let subviewGroup: GridViewGroup 

나는 오류를 얻을 ~을 사용할 수있다. 선택 사항이지만 init() 호출 후에는 결코 nil이되지 않으므로 불필요한 것처럼 보입니다. subviewGroup을 선택 사항으로 만들지 않고도 올바르게 수행 할 수 있습니까? 여기

당신이 발견, 선택적으로 사용하고, 옵션

/*** Initializers ***/ 
init(frame: NSRect) { 
    super.init(frame: frame) 
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
} 

/*** Properties ***/ 
let subviewGroup: GridViewGroup? 
+0

이 내용은 [http://stackoverflow.com/questions/24351211/property-not-initialized-at-super-init-call](http://stackoverflow.com/questions/24351211/property)와 유사하다는 것을 알고 있습니다. -not-initialized-at-super-init-call)하지만 충분히 평판이 나지 않아서 질문에 대해 언급 할 수 없었습니다. –

+0

내가 정말로 알고 싶은 것은 옵션을 사용하지 않는 방법이 있다면입니다. –

+0

Do 선택 사항을 사용하는 실제 예제가 있습니까? – connor

답변

5

이것은 정확히 암시 적으로 래핑되지 않은 옵션이 적합합니다. 당신은 쉽게 다음과 같이 귀하의 예제에 추가 할 수 있습니다 : 암시 적으로 풀어 옵션을 사용하여

/*** Initializers ***/ 
init(frame: NSRect) { 
    super.init(frame: frame) 
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
} 

/*** Properties ***/ 
let subviewGroup: GridViewGroup! 

당신이 선택하지 것처럼 변수를 치료하고 액세스 할 수 있습니다 당신이 그것을 호출 할 때 직접 기본.

보통 선택 사항을 사용하면 코드는 var nonoptional: GridViewGroup = subviewGroup!처럼 보이지만 암시 적으로 래핑되지 않은 옵션은! ​​: var nonoptional: GridViewGroup = subviewGroup을 무시할 수 있습니다. 애플의 워드 프로세서

:

Implicitly unwrapped optionals are useful when an optional’s value is confirmed to exist immediately after the optional is first defined and can definitely be assumed to exist at every point thereafter. The primary use of implicitly unwrapped optionals in Swift is during class initialization

+0

감사합니다. –

0

올바른 솔루션을 사용하여 작업 예이다. 그러나 결코 nil 외부의 init이 아니므로 암시 적으로 래핑되지 않은 옵션을 사용할 수 있습니다.

2

사용 사례가 암시 적으로 풀어 선택을 위해 밖으로 울고있다; 이것은 하나를 사용할 때의 완벽한 예이며이 패턴은 Cocoa Touch API의 여러 곳에서 사용됩니다.

A. 같은 것을해야 당신의 초기화의 올바른 순서 :

init(frame: NSRect) { 
     subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
     super.init(frame: frame) 
    } 

... 스위프트 프로그래밍 도서 당 :

이 우선

"A 지정 이니셜 라이저는 수퍼 클래스 이니셜 라이저에 위임하기 전에 클래스에서 도입 된 모든 속성이 초기화되도록해야합니다. "

두 번째로 :

B. subviewGroup 상수를 암시 적으로 래핑되지 않은 옵션으로 선언하십시오. 이렇게하면 기본값 인 nil이 제공됩니다. 즉, 컴파일러가 염려되는 한 초기화 된 요구 사항이 충족되었음을 의미합니다.이 양식을 사용하면 (예 : let을 사용한 상수이기 때문에) 무제한 값을 할당 할 수 있으므로 한 번만 기회를 가질 수 있습니다.

let subviewGroup: GridViewGroup! 

init(frame: NSRect) { 
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self) 
    super.init(frame: frame) 
} 

이 도움이 되었기를 바랍니다.

+0

참고 : 암시 적으로 이미 'subviewGroup'을 초기화했다고 가정합니다. 래핑되지 않은 선택 사항 인 경우 위의 * A *에서 설명한 init() 메서드의 작업 순서는 중요하지 않습니다. 그러나, 나는 아직도 규정 된 패턴을 따르는 것이 좋은 습관이라고 믿는다. – fqdn

+1

나는이 대답에 혼란스러워한다. 컴파일러는 다음과 같이 불평합니다 : "super.init 호출 전에 사용 된"self " – taylorcressy

관련 문제