2017-10-11 1 views
0

클로저를 처리하는 메서드를 만들고 싶습니다. 폐쇄는 메서드 호출을 포함하고 내 폐쇄 방법은 순서대로 실행해야한다, 예를 들면 :어떻게이 폐쇄문을 작성 하시겠습니까?

when("I tap the Get Coffee button") 
{ 
    _ in 
     self.tap(p.button1) 
     self.wait(1) 
     self.tap(p.button1) 
     return true 
} 

그리고 내 (간체) 폐쇄 방법 :

cannot convert value of type '(_) -> _' to expected argument type '(() -> Bool)?'

:이 오류가 발생

public func when(_ name:String, closure:(() -> Bool)? = nil) 
{ 
    if let c = closure 
    { 
     _ = c() 
    } 
} 

이 함수가 작동하려면 closure 인수에 어떤 유형을 정의해야하는지 이해할 수 없습니다.

when("I tap the Get Coffee button") 
{ 
    _ in 
     tap(p.button1) 
     wait(1) 
     tap(p.button1) 
     return true 
} 
+1

폐쇄가 선택하게하는 점은 무엇입니까? 클로저없이'when' 메서드를 호출 할 수 있습니까? – rmaddy

+1

그리고 반환 값을 무시하기 만한다면 왜 Bool의 리턴 타입으로 클로저를 정의해야합니까? – rmaddy

+0

@maddy 두 가지 모두에 대한 이유가 있으므로, 나는 썼다 (단순화). – BadmintonCat

답변

1

_ in을 제거 : 그것은 함께 작동하도록

또한, 나는, 폐쇄의 self. 참조를 제거하고 싶습니다. 즉, 클로저에 매개 변수가 있지만 클로우즈가 () -> Bool, 즉 매개 변수가 없다는 것을 컴파일러에 알립니다.

self을 제거하는 경우 클로저를 이스케이프 처리하지 않아야합니다. 모든 옵션 폐쇄 따라서 폐쇄가 아닌 선택 사항이되어야 할것, @escaping 있습니다

public func when(_ name:String, closure:(() -> Bool)) { 
    _ = closure() 
} 

when("I tap the Get Coffee button") { 
    tap(p.button1) 
    wait(1) 
    tap(p.button1) 
    return true 
} 

소유권 사이클 (메모리 누수)과 self의 모든 사용 (self 캡처 것)해야합니다 그 이유는을 만들 수있는 탈출 폐쇄 명백한.

+0

예, 알고 있습니다. 그러나이 코드에 올바른 인수 유형을 사용하도록 변경하려고합니다. 또한, .self를 제거하는 것은 어떨까요? – BadmintonCat

+0

그래서 선택의 여지가 있습니까? 힌트를 가져 주셔서 감사합니다! – BadmintonCat

1

나는 당신이 원하는 것을 얻을 것이라고 생각합니다. 나는 틀린 것일지도 모른다.

self없이 tapwait을 사용하려는 경우 클로저의 매개 변수 목록에 필요합니다.

tap의 서명은 (UIButton) ->()이고 wait의 서명은 (Int) ->() 인 것으로 보입니다.

그래서이 두 클로저를 클로저에 전달하십시오.

typealias WhenHandler = ((UIButton) ->(), (Int) ->()) -> Bool 

그리고 당신의 when 방법은 단지가 될 수 있습니다 : 유형이 매우 복잡지고 있기 때문에

, 난 당신이 유형 별칭을 사용하는 것이 좋습니다

public func when(_ name:String, closure: WhenHandler) 

당신은에 self.tapself.wait을 통과해야

if let c = closure 
{ 
    _ = c(self.tap, self.wait) 
} 
에서 closurewhen입니다.

지금, 당신은이 같은 when를 호출 할 수

when("I tap the Get Coffee button") 
{ 
    tap, wait in 
     tap(p.button1) 
     wait(1) 
     tap(p.button1) 
     return true 
} 
관련 문제