2014-07-21 1 views
0

는, I는 다음 init() 기능을 가지고 _state는 구조체와 Statequeue 글로벌 디스패치 큐의 인스턴스INIT와 수수께끼() 및 클래스 dispatch_sync

init() { 
    let q = 0 
    dispatch_sync(queue) { 
     self._state = State(q) 
    } 
} 

.

잠재적으로 동시에 액세스 할 수있는 클래스의 인스턴스를 동기화하기 위해 dispatch_sync 호출을 사용하고 있습니다.

(이 초기화되고 전에 블록을 사용하여 즉,) 내가 컴파일러는 키우면가 초기화되기 전에 _state 변수를 사용하는 방법에 대한 불평 것을, 몇 가지 이상한 문제에 실행 해요 :

main.swift:363:37: error: variable 'self._state' used before being initialized 
    dispatch_sync(s_sync_queue) { 
           ^

그러나 디스패치 대기열과 블록을 사용하는 유일한 목적은 ivar을 초기화하는 것입니다.

컴파일러도 상태 코드는 변수 _state를 초기화하지 않고 반환 :

main.swift:372:5: error: property 'self._state' not initialized 
} 
^ 

을 명확하게이기는하지만, 인해 init가 초기화되지 않은 변수 _state을 떠나지 않고 반환 할 수있는 기능 dispatch_sync에.

그렇다면 효율적인 방법으로 어떻게 문제를 해결할 수 있습니까?

답변

1

하나의 옵션은 당신이 할 수있는 경우 선택적으로 _state을 선언하는 것입니다. 당신은 당신이 dispatch_sync에서 사용할 수있는이 옵션으로 할 경우

var _state:State? 

을 (그렇게 전혀 해가없는 경우).

+0

구조체 'State'는 이미 enum입니다. 나는이 접근법을 조사 할 것이다. 이니셜 라이저에는 매개 변수가 필요합니다. 아마도, "NotInitialized"열거 형 값을 사용하여 "기본"이니셜 라이저를 정의 할 수 있습니다. – CouchDeveloper

+0

더 많은 코드를 게시 할 수 있습니까 ?? 문제 해결에 도움이됩니다. – codester

+0

아이디어는 매개 변수없이 init 함수를 제공하는 것입니다 :'init()'- 디폴트로 구조체를 초기화합니다. 그런 다음 블록에서 변수를 사용할 수 있습니다. 블록이 완전히 설정됩니다. – CouchDeveloper