는, I는 다음 init()
기능을 가지고 _state
는 구조체와 State
queue
글로벌 디스패치 큐의 인스턴스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
에.
그렇다면 효율적인 방법으로 어떻게 문제를 해결할 수 있습니까?
구조체 'State'는 이미 enum입니다. 나는이 접근법을 조사 할 것이다. 이니셜 라이저에는 매개 변수가 필요합니다. 아마도, "NotInitialized"열거 형 값을 사용하여 "기본"이니셜 라이저를 정의 할 수 있습니다. – CouchDeveloper
더 많은 코드를 게시 할 수 있습니까 ?? 문제 해결에 도움이됩니다. – codester
아이디어는 매개 변수없이 init 함수를 제공하는 것입니다 :'init()'- 디폴트로 구조체를 초기화합니다. 그런 다음 블록에서 변수를 사용할 수 있습니다. 블록이 완전히 설정됩니다. – CouchDeveloper