Swift - Closures 1

 

Swift의 Closures 정리 1 - Closures 개요 및 Closure Expression

Closures #1


  • Closures는 코드 내에서 전달되고 사용될 수 있는 기능적으로 독립된 블럭이다.
  • Swift의 Closures는 C와 Objective-C의 블럭이나 타 언어의 람다식과 유사하다.
  • Closures는 context안에서 정의된 상수나 변수의 참조를 capture하거나 저장할 수 있다.
  • 함수 중 Global 함수와 중첩 함수는 Closures으 특수한 경우이다.
  • Closures는 다음 3가지 중 한 가지의 형태를 가진다.
    • Global 함수는 함수 이름을 가지며 어떤 값도 capture하지 않는 closures이다.
    • 중첩 함수는 이름을 갖고 있으며 둘러싸고 있는 함수의 값들을 capture할 수 있는 closures이다.
    • Closure 표현식은 경량 문법으로 씌여진 closures이며 둘러싸고 있는 context의 값들을 capture할 수 있다.
  • Swift의 closure 표현식은 일반적인 시나리오에서 권장하는 간결하고 깔끔한 문법으로 최적화된 깨끗하고 명확한 스타일을 가지고 있는데 이 최적화는 다음과 같다.
    • context로부터 파라미터와 리턴 값의 type을 추론한다.
    • 단문 표현 closures는 암시적인 reurn을 한다.
    • 축약된 argument names를 사용한다.
    • closures 문법을 따른다.

Closure Expression

  • 중첩 함수는 커다란 함수 안에서 그 일부분으로 독립된 코드 블럭을 명명하고 정의하는 편리한 방법이다.
  • 하지만 때때로 완전한 선언이나 이름 없이 함수처럼 보이는 간단한 버전으로 작성하는 것이 유용하다.
  • 하나 이상의 인자를 취하는 함수나 메서드로 작업을 할 때 더 유용하다.
  • Closure Expression는 간결하고 집중적인 문법으로 inline closures를 작성하는 방법이다.
  • Closure Expression은 그 명확성과 의도를 잃지 않고 단축된 closures를 작성하는데 최적화된 문법이다.

The Sorted Method

  • sorted(by:) 함수는 알려진 type의 배열 값들을 개발자가 제공하는 closure를 기반으로 정렬하여 돌려준다.
  • 이 함수는 정렬 프로세스가 끝나면 이전과 동일한 type의 동일한 크기를 지면서 정확한 정렬기준으로 정렬된 새로운 배열을 반환한다.
  • 새로운 배열을 반환할 뿐, 이전 배열은 변하지 않는다.
  • 정렬 closure를 전달하는 한가지 방법은 일반적인 함수 type을 정확하게 쓰는 것이다.
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

// normal function
func backward(_ s1: String, _ s2: String) -> Bool {
	return s1 > s2
}

var reverseNames = names.sorted(by: backward)
// reverseNames = ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
  • 하지만 온전한 함수 형태를 사용하는 것은 한줄짜리 짧은 표현식을 쓰기 위한 것으로는 길고 지루한 일이다.
  • 이런경우 Closure Expression 문법을 이용하는 것이 더 낳은 방법이다.

Closure Expression Syntax

  • Closure Expression Syntax의 일반적인 형태이다.
{(parameters) -> return type in
	statements
}
  • Closure Expression에서의 parameters는 in-out parameters이지만 기본값은 가질 수 없다.
  • 가변인자의 이름을 지정할 경우 가변인자도 사용할 수 있다.
  • 파라미터나 반환 type으로 튜플도 사용할 수 있다.
// Closure Expression
reverseName = names.sorted(by: {s1: String, s2: String) -> Bool in
	return s1 > s2
})
  • 선언된 파라미터와 반환 Type은 backward(_:_:)와 동일하다.
  • 하지만 closure expresion에서의 파라미터와 반환 Type은 중괄호 밖이 아니라 안에 작성된다.
  • closure의 내용은 in 키워드 다음에 작성한다.
  • in 키워드는 closuer의 파라미터와 반화 Type 정의가 끝났으며 함수 내용이 시작된다는 것을 알려준다.
  • closuer는 내용이 짧아 보통은 한줄로 쓰기도 한다.
reverseName = names.sorted(by: {s1: String, s2: String) -> Bool in return s1 > s2 })