2014-12-29 3 views
4

반환 값에 대해 신경 쓰지 않는 함수를 선언 할 수있는 방법이 있습니까? 반환하는 함수 선언도 무효입니까?

extension Array { 
    func forEach(function: (element: T) ->()) { 
     for e in self { 
      function(element: e) 
     } 
    } 
} 

지금 내가하고 싶은 : 예를 들어 나는이 배열 확장자가

textFields.forEach{$0.resignFirstResponder()} 

을 그리고 기능은 무효 복귀 선언 할 수 있기 때문이다.

textFields.forEach{$0.resignFirstResponder();return} 

을하지만 어떤 값을 반환하거나 무효 할 수 있도록 기능을 선언하는 일반적인 방법이있다 :

이 문제를 해결할 것인가?

감사합니다. 당신이 아무 제약 번째 제네릭 매개 변수를 추가하고 반환하는 기능을 입력하면

답변

3

, 다음 모든 반환 값은 받아 들여질 것이다 : 그러나

extension Array { 
    func forEach<U>(function: (Element) -> U) { 
     for e in self { 
      function(e) 
     } 
    } 
} 

func f(i: Int)->Int { 
    return i * 2 
} 

func g(i: Int) -> Double { 
    return Double(0.0) 
} 

func h(i: Int) { 
    println("\(i)") 
} 

let a = [1,2,3] 
a.forEach(g) // U will be an Int 
a.forEach(f) // U will be a Double 
a.forEach(h) // U will be a() 

, 난 강력하게이 작업을 수행하지 좋을 것 및 대신 for…in을 사용하십시오.

배열에서 함수를 실행하지만 반환 값을 사용하지 않는 유일한 목적은 부작용입니다. 좀 더 긴급한 스타일로 작성하고 부작용과 외부 상태 (더 선언적인 기능 스타일과 반대되는)를 사용하는 경우 for…in을 사용하여이 작업을 수행하는 것이 훨씬 더 좋습니다.

자신의 의사 제어 구조를 만드는 데 불쾌한 문제가 있습니다. 예를 들어, 다음에 대해 생각해보십시오.

이것은 일반적인 관행입니다. 어떤 목표 (또는 실패)가 달성되면 일찍 함수를 잘라냅니다. 그러나 forEach 구조에서는 약간 오도하는 것입니다. 일반 루프처럼 보입니다. 그러나 실제로는 클로저로, 그 클로저에서 반환되어 forEach이 다음 루프를 호출 할 준비가되었습니다 (본질적으로 일반 루프에서는 continue처럼 동작 함).

+1

유형 매개 변수를 사용했지만 ''을 잊어 버렸습니다. - 감사합니다! 그리고 네, 아마 대신에 for ... for를 사용으로 전환합니다. 이제는 애플이 각자를 위해 추가하지 않았다는 것이 더 이해할 만하다. – Ixx

0

사용 map() :

let textFields : [UITextField] = [] // or whatever 
textFields.map{$0.resignFirstResponder()} 

이 방법은 반환 형식을 지정할 필요가 없습니다, 당신이 당신의 forEach 확장자 map를 재발견 할 필요가 없습니다.

+0

이 작동하지만 부작용에 맵을 사용하는 것이 약간 이상하다고 느낍니다 ... – Ixx

+0

순수 언어에 익숙해지면 이상하게 느껴지지만 그렇게하지 않는 것이 충분한 이유라고 생각하지 않습니다. 하나의 차이점은 모나드 (이 경우'IO') 안에 있지만 Swift는 그것의 타입 내에 부작용이 존재하지 않는다는 것입니다.'map '와'mapM'은 동일 할 것입니다. 또한'nouns.map {noun.verb()}'라고 읽으므로 행이 무엇인지 분명하게 알 수 있습니다. 'forEach'를 좀 더 명확하게 정의하고 싶다면'forEach'를'map'과 동일하게 정의하면됩니다. –