2014-09-21 3 views
7

내가 겪고있는 문제를 이해하는 데 어려움을 겪고 있습니다. 간단히하기 위해 UIView 메서드를 사용합니다. 기본적으로 방법을 쓸 경우스위프트 완료 블록

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      println("test") 
    }) 

잘 작동합니다. 지금, 나는 같은 방법하지만과 같이 문자열을 생성 할 경우 : 그것은 작동하지

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      String(23) 
    }) 

합니다. 컴파일러 오류 : 호출에서 매개 변수 '지연'에 대한 누락 된 인수

이제 이상한 부분이 있습니다. 실패한 코드와 똑같은 코드를 작성하면 다음과 같이 인쇄 명령을 추가하면됩니다.

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      String(23) 
      println("test") 
    }) 

다시 작동하기 시작합니다.

내 문제는 기본적으로 똑같습니다. 내 코드 :

downloadImage(filePath, url: url) {() -> Void in 
     self.delegate?.imageDownloader(self, posterPath: posterPath) 
     } 

이 작동하지 않습니다. 하지만 내가 바꿀 경우.

downloadImage(filePath, url: url) {() -> Void in 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
       println("test") 
      } 

심지어는 :

downloadImage(filePath, url: url) {() -> Void in 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
      } 

그것은 잘 작동합니다. 왜 이런 일이 발생하는지 이해할 수 없습니다. 나는 이것이 컴파일러 버그라는 것에 동의 할 만하다. 그들은 단지 하나의 표현들로 구성 될 때 스위프트의

답변

10

클로저 implicit returns 있습니다. 여기 당신의 문자열을 만들 귀하의 경우에는

reversed = sorted(names, { s1, s2 in s1 > s2 }) 

:이 이와 같은 간결한 코드를 허용 당신이 그 문자열을 반환 결국

UIView.animateWithDuration(1, animations: {() in }, completion:{(Bool) in 
    String(23) 
}) 

을하고는 폐쇄의 서명을 만드는 :

를 더 이상은 Fi를 할 수 없기 때문에 스위프트의 비밀 Missing argument for parameter 'delay' in call 오류로 변환 animateWithDuration의 서명 (가 요구 무슨 일치
(Bool) -> String 

일치하는 적절한 서명을 찾는다). 서명을하게

UIView.animateWithDuration(1, animations: {() in}, completion:{(Bool) in 
    String(23) 
    return 
}) 

그것이 있어야 무엇을 :

(Bool) ->() 

귀하의 마지막 예 :

쉽게 수정하여 폐쇄의 끝에 빈 return 문을 추가하는 것입니다

downloadImage(filePath, url: url) {() -> Void in 
    self.delegate?.imageDownloader(self, posterPath: posterPath) 
    self.delegate?.imageDownloader(self, posterPath: posterPath) 
} 

두 표현식이 있기 때문에 작동합니다. 암시 적 리턴은 클로저가 단일 표현식을 포함 할 때만 발생합니다. 따라서 클로저는 아무 것도 반환하지 않으며 서명이 일치합니다.

+0

감사합니다. 그러나 String (23)을 추가하고 같은 줄을 다시 복사하면 왜 실패하지 않습니까? String (23); 문자열 (23); ? – Wak

+0

사실 그 대답을 명확히하는 중이었습니다. 편집을 참조하십시오. –

+0

이 답변을 주셔서 감사합니다; 내가 이상한 이유를 알아내는 데 도움이되었습니다. "animateWithDuration '을 인수 목록과 함께 호출 할 수 없습니다 ..."오류가 발생했습니다. 이 수정 프로그램은 정확히 동일합니다. – SonarJetLens