2014-09-01 2 views
15

다음과 같은 오류가 발생합니다. 'Bool'은 'Void'의 하위 유형이 아닙니다.Swift - 'Bool'은 'Void'의 하위 유형이 아닙니까?

performBlock은 인수없이 void 클로저를 사용하고 메소드 자체에는 단일 인수가 있으므로이 함수를 사용할 수 있어야합니다. 내 폐쇄 구문을 다음과 같습니다. 이 컴파일 오류가 발생하는 이유는 무엇입니까? performBlock

workingManagedObjectContext.performBlock { 
    self.workingManagedObjectContext.save(nil) 

    self.managedObjectContext.performBlock { 
     self.managedObjectContext.save(nil) 
    } 
} 

답변

27

인수 은 고정 인자를 고려하지 않고 무효 (즉에는 반환 값) 반환되지 않는다. 클로저가 단일 식으로 구성된 경우 반환 유형은 해당 식의 유형 인 에서 유추됩니다.

self.managedObjectContext.save(nil) 

의 유형은 암시 적으로 Void로 변환 할 수 없습니다 Bool이다. 그 문제를 해결하려면, 당신은 명시 적 return 문을 추가 할 수 있습니다

self.managedObjectContext.performBlock { 
    var error : NSError? 
    if !self.managedObjectContext.save(&error) { 
     // report error 
    } 
} 

을 (그리고 작업을 수행합니다

self.managedObjectContext.performBlock { 
    self.managedObjectContext.save(nil) 
    return 
} 

또는 (더 나은), 그것을 무시하고 대신 save 작업의 반환 값을 확인 바깥 쪽 레벨 저장과 동일).


업데이트 : 스위프트 1.2 (엑스 코드 6.3)로, 비 공간 리턴 유형의 주석이 달려 있지 않은 단일 식 폐쇄 보이드 지금 상황에서 사용될 수있다. 그래서 지금은 오류없이 컴파일 않습니다

self.managedObjectContext.performBlock { 
    self.managedObjectContext.save(nil) 
    // explicit "return" not needed anymore in Swift 1.2 
} 

(. 물론 실제로 체크 저장 작업의 반환 값 에 여전히 더 나은)
관련 문제