2014-06-16 2 views
0

저는 스위프트를 사용하고 있으며 기존의 objective-c 블록에 클로저를 지정할 수있는 방법이 있는지 궁금합니다.브릿지를 사용하여 기존의 objective-c 블록에 액세스하는 신속한 클로저 (블록 상당) 할당

fromObjC?.performBlock = {someVar in /*do something*/} 

"이 표현의 결과에 할당 할 수 없습니다."라는 오류 메시지가 나타납니다.

+0

예, 방법이 있지만 형식이 일치해야합니다. performBlock은 어떤 유형입니까? – drewag

+0

** bold **'void (^ performBlock) (UIStoryboardSegue * segue, UIViewController * svc, UIViewController * dvc) ' – Axel

+0

선택적 연결의 결과에 할당 할 수 없습니다. 가장 쉬운 방법은'if let p = fromObjC {p.performBlock = ...} '입니다. –

답변

7

objective-C의 개체에 대한 모든 포인터는 포인터가 없으므로 신속하게 선택 가능해야합니다. 변수가 실제로 nil이되지 않는다는 것을 안다면 암시 적으로 래핑되지 않은 옵션 (TypeName!)을 사용하여 래핑 할 필요가 없습니다.

그래서

void(^performBlock)(UIStoryboardSegue* segue, UIViewController* svc, UIViewController* dvc) 

가된다 : 변수가 nil이있을 경우

{(segue : UIStoryboardSegue!, svc : UIViewController!, dvc : UIViewController!) in 
    // Implementation 
} 

, 당신은 다음과 같을 것이다 정상적인 선택적으로 사용한다 : 실제로

{(segue : UIStoryboardSegue?, svc : UIViewController?, dvc : UIViewController?) in 
    // Implementation 
} 

과, 이 속성에 속성을 할당하면 형식을 지정하지 않아도됩니다 (유추됩니다) :

{(segue, svc, dvc) in 
    // Implementation 
} 
+0

안녕하세요, @drewag, 무엇이 잘못되었는지 알았습니다. 내 형식 형식을 포함하여 모든 것이 좋습니다. ** fromObjC ?performBlock **이었습니다. ** fromObjC !performBlock **이어야합니다. 감사! – Axel

+0

그래서 왜 그 "in"단어를 추가해야합니까? {(segue, svc, dvc)} – zumzum

+0

@zumzum은 언어의 구문입니다. 매개 변수 목록과 구현의 시작 부분을 끝내야 함을 나타냅니다. – drewag