본문 바로가기
Coding

Swift 클로저(closures)

by BlissBless 2017. 11. 30.

● Closure하면 생각나는 2가지.


Closure라는 단어를 보면, 일렉트로닉 듀오인 Disclosure랑 Closure와 관련 된 영어 표현. 이렇게 두 가지가 떠오른다.


첫번째,

Disclosure 뜻은 폭로, 노출, 공개, 기업 재무 내용 공개인데, 남편과 연예 할 때, 이 그룹이 노래를 참 많이도 들었더랬다.



두번째,

Closure 뜻은 Disclosure랑 반대다. 폐쇄, 닫힘, 속함 이란 뜻인데, 보통 이별을 하고 나서 move on 하기 위해 완정히 정리하는 것, 끝맺음이라는 표현으로 쓰인다.  "you need closure to move on" ( 너느 과거를 잊고 새롭게 출발하기 위해서 끝맺음이 필요해) 같은?


여튼 두가지가 생각이 난다.



● Closure?

{} 형식의 실행 가능한 코드 블럭인데, 캡쳐 (선언 될 당시의 환경?) 나 레퍼런스를 저장 할 수 있고, 상수나 변수의 문맥안에 정의 될 수 있다. 

함수가 있는데, 굳이 왜 또 클로저란게 있을까 싶은데, 클로저를 이용하면 긴 코드를 짧게 줄일 수 있다.


클로저는 이렇게 표현한다. 리턴 타입이 있을 때 (위) 없을 때(아래)


{ (parameters) -> return type in
statements
}


{ (parametersin
statements
}

 



여러 형태의 클로저.


var noParameterAndNoReturnValue: () -> () = {

    print("Hello!")

}


var noParameterAndReturnValue: () -> (Int) = {

    return 1000

}


var oneParameterAndReturnValue: (Int) -> (Int) = { x in

    return x % 10

}


var multipleParametersAndReturnValue: (String, String) -> (String) =

{ (first, second) -> String in

    return first + " " + second

}

 


예시 출처 이곳



클로저 예제로 많이 쓰는 예제. 실제 쓴다면 요런 느낌?


var numbers = [1, 4, 2, 5, 8, 3]


numbers.sort(by: { x, y in

    return x < y

})


print(numbers)

 



● Closure와 잘 어울려다니는 친구, 단축인자 (Shorthand Parameter Names)

한국어로 shorthand parameter name  이걸 정확하게 뭐라고 칭하는지 모르겠지만 단축인자 라고 부르기도 하나보다.

이건 넘어오는 순서대로 $0, $1, $3... 으로 줄여서 쓸 수 있다.


var double: (Int) -> (Int) = { x in

    return 2 * x

}


double(2) // 4

 



● Closure 이용하면 얼마나 어떻게 짧아 지나?


//클로저 얼마만큼 줄일 수 있나 보자.

//sort 함수 예시 _오리지날


let names: [String] = ["wizplan", "eric", "yagom", "jenny"]


func backwards(first: String, second: String) -> Bool {

    return first > second

}

let reversed: [String] = names.sorted(by: backwards)


//sort 함수 예시 _짧아지고 있음1

let reversed1: [String] = names.sorted(by: { (first: String, second: String) -> Bool in return first > second

} )

print(reversed1)


//sort 함수 예시 _짧아지고 있음2 _ 매서드 소괄호 생략

let reversed2: [String] = names.sorted { (first: String, second: String) -> Bool in return first > second

}


// 함수 예시 _짧아지고 있음3 _ 문맥을 통한 타입 유추

//클로저의 매개변수 타입과 반환 타입을 생략하여 표현 할 수 있음.

let reversed3: [String] = names.sorted { (first, second) in return first > second }


//sort 함수 예시 _짧아지고 있음4 _ 단축 인자 이름 사용

//단축인자 사용 하면, 매개변수 및 반환 타입과 실행 코드를 구분하기 위해 사용했던 in 불필요

let reversed4: [String] = names.sorted { return $0 > $1 }


//sort 함수 예시 _짧아지고 있음5 _ 암시적 반환 표현

//반환 값을 갖는 클로저고 내부 실행문이 단 1줄일 경우, 암시적으로 그 실행문은 반환 값으로 사용.

let reversed5: [String] = names.sorted { $0 > $1 }


//sort 함수 예시 _짧아지고 있음6 _ 연산자도 함수. 연산자 사용

let reversed6: [String] = names.sorted(by: >)

 


진짜 많이 짧아진다. 함축되기 때문에 읽고 순간 "이건 뭐여?" 할 때가 있긴 하다. 그렇지만, 코드를 쓰는 사람도 읽는 사람도 짧은게 둘 다에게 좋을 것 같다. 핵심만 딱딱 뽑아낸 한줄 요점 정리 노트 같아 보이긴 한다.ㅎㅎㅎ