+ Closure

- Swift 클로저는 세 가지 형태를 가지고 있음

1. 기본적인 형태
{ (파라미터 목록) -> 리턴형 in 실행할 코드 } or  { 실행할 코드 }

예1 

let simpleClosure = { (str: String) -> String in

    return "Hello, \(str)"

}


let result = simpleClosure("Swift Closure")

print(result)


예2 ) 

let simpleClosure = { print("Hello, Swift") }


simpleClosure()



- 클로저를 파라미터로 받는 함수

fun performClosure ( _ co: (String) -> (String) ) {

let result = co("Swift Closure")

print(result)

}


호출1 : 변수나 상수 전달

performClosure( simpleClosure )

호출2 : 인라인 클로저

performClosure( { (str: String) -> (String) in

    return "Hello2, \(str)"

} )



- 인라인 클로저의 경우 파라미터와 리턴형 추론 가능

예)

performClosure( { str in

    return "Hello3, \(str)"

})


- 암시적 리턴 (return 키워드 생략 가능, 인라인 클로저가 하나의 return명령문으로 구현되어있을 때만)

예)

performClosure( { str in

    "Hello4, \(str)"

})


- 클로저 내부에서 사용할 수 있는 축약된 인자이름 제공, 첫 번째 인자의 이름은 $0, 두 번째 인자의 이름은 $1 ..., 축약된 인자 이름 사용 시 파라미터 이름과 in 키워드를 생략가능

예 )

performClosure( { "Hello5, \($0)" })


2. 연산자 함수

- 클로저가 두 개의 파라미터를 비교한 후 결과를  Bool로 리턴한다면 인라인 클로저를 연산자 함수로 태체가능.

예1 ) 컬렉션을 정렬할 때 사용하는 sort 함수를 구현

let numbers = [1, 7, 23, 5, 8, 3, 6]

let orderedNumbers = numbers.sorted(by: { (lhs: Int, rhs: Int) in

    return lhs < rhs

} )


예2 ) 연산자 함수로 대체

let orderedNumbers2 = numbers.sorted(by: <)


3. Trailing Closure

- 인라인 클로저는 함수 호출 구문에 포함되는 형태이므로 클로저의 구현 부분이 단순한 경우에 적합

- 클로저의 구현이 복잡한 경우에는 트레일리 클로저로 구현하는 것이 좋음

- 인라인 클로저와 트레일링 클로저의 가장 큰 차이는 클로저가 포함되는 위치

1. 인라인 클로저는 함수 호출 시 사용하는 괄호 내부에 위치

예 ) 

performClosure( {( "Hello InlineClosure, \($0)")} )

2. 트레일링 클로저는 괄호 이후에 위치

예 )

performClosure() { "Hello TrailingClosure, \($0)" }


- 클로저가 함수의 마지막 파라미터로 전달되는 경우에만 사용가능

- 함수 이름 다음에 바로 {}가 온다면 이 함수는 하나의 파라미터를 가지고 있고, 트레일링 클로저라는 것을 직관적으로 유추할 수 있어야함 (함수와 혼동 할 수도 있기 때문)


- Swift 클로저는 외부에 선언되어 있는 변수를 클로저에 선언되는 시점에 변수의 참조가 클로저 내부로 전달되어 클로저 내부 또는 외부에서 값을 변경할 경우 동일한 값으로 변경됨


'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

Date  (0) 2017.02.17
String  (0) 2017.02.17
Tuple (튜플)  (0) 2017.02.10

+ Recent posts