Language/Swift

Swift 클로저

Greensky0026 2021. 3. 11. 20:57
반응형

Closures입니다. closer 아닙니다!! ㅎㅋㅋ

 

 참조 타입인 클로저란 코드의 블럭을 뜻합니다.

자세히 설명하자면, 코드안에서 전달되어 사용할 수 있는 로직을

가진 코드의 코드의 블럭이며 {}로 구분됩니다.

일급 시민 취급이라 전달인자 및 변수, 상수들으로 저장, 전달이 가능합니다.

함수는 클로저의 일종으로 이름이 있는 클로저라고 생각하면 된다고 합니다.

  • 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
  • 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
  • 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저

Swift에서 클로저는 다음과 같은 내용을 포함해 최적화되어 있습니다.

  1. 문맥(context)에서 인자 타입(parameter type)과 반환 타입(return type)의 추론
  2. 단일 표현 클로저에서의 암시적 반환
  3. 축약된 인자 이름
  4. 후위 클로저 문법

 

기본 형태

{
	(매개변수 목록) -> 반환타입 in
		실행 코드
}

 

예제

 sum 이라는 함수에 클로저를 할당하는 예제입니다.

let sum : (Int, Int) -> Int {
	(a: Int, b: Int) in 
		return a + b
}

let result: Int = sum(3, 9)
print(result)  // 12

 

함수의 전달인자로써의 사용

 클로저는 함수의 전달인자로 많이 사용됩니다.

내부에서 원하는 코드블럭을 실행할 수 있습니다.

클로저를 함수의 전달인자로 사용해 사칙연한을 하는 예제입니다.

let add: (Int, Int) -> Int
	add = { (a: Int, b: Int) in
		return a + b
}
let sub: (Int, Int) -> Int
	sub = { (a: Int, b: Int) in
		return a - b
}
let div: (Int, Int) -> Int
	div = { (a: Int, b: Int) in
		return a / b
}
let mul: (Int, Int) -> Int
	mul = { (a: Int, b: Int) in
		return a * b
}

func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
	return method(a, b)
}

var calc: Int
calc = calculate (a: 8, b: 4, method: add)
print(calc) //12
calc = calculate (a: 8, b: 4, method: sub)
print(calc) //4
calc = calculate (a: 8, b: 4, method: div)
print(calc) //2
calc = calculate (a: 8, b: 4, method: mul)
print(calc) //32

//함수 호출시 클로저로 상수/변수 전달하기
var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2:  Int) -> Int in
	return (num1 + num2)
})
print(clac_add) //12

 

다양한 클로저 표현들

 클로저 매개변수를 갖는 함수와 결과값을 저장할 변수를 먼저 선언하겠습니다.

func calc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
	return method(a, b)
}

var result: Int

 

후행 클로저

 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략하고

함수 소괄호 외부에 클로저를 위치시킬 수 있습니다.

/*
기존에 사용했던 함수
var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2: Int) -> Int in
	return (num1 + num2)
})
*/
result = calc(a:4, b:5) { (num1: Int, num2: Int) -> Int in
	result num1 + num2
}

print(result) //9

 

반환타입 생략

 calc의 반환값이 Int임이 명시되어 있으므로, 반환타입은 생략가능 합니다.

result = calc(a: 4, b: 5, method: { (num1: Int, num2: Int) in
    result num1 + num2
})

// 후행클로저
result = calculate(a: 4, b: 5) { (num1: Int, num2: Int) in
    return num1+ num2
}

print(result) //9

 

이름 인자 축약

 클로저의 매개변수 이름을 필요하다면 단축 인자이름을 활용할 수 있습니다.

단축 인자이름은 언급된 매개변수의 순서대로 $0, $1, $2, $3...로 표현됩니다.

result = calc(a:4, b:5, method:{
	return $0 + $1
})

//후행 클로저에 적용
result = calc(a:4, b:5) {
	return $0 + $1
}

print(result) //9

 

암시적 반환

클로저의 반환값이 있다면, 클로저 마지막 줄의 결과는 암시적으로 반환값으로 취급합니다.

result = calc(a:4, b:5, method:{ $0 + $1 })

//후행 클로저에 적용
result = calc(a:4, b:5) { $0 + $1 }

 


 

함수로 구현

func add(_ num1: Int, _ num2: Int)-> Int{
	return num1 + num2
}
var result = add(3,4)
print(result) //7

클로저로 구현

func add(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
	return method(a, b)
}
var result: Int

//축약 전의 클로저
result = add(a: 3, b: 4, method: { (num1: Int, num2: Int) -> Int in
    return num1 + num2
})
print(result) //7

//축약 후의 클로저
result = add(a: 3, b: 4) { $0 + $1 }
print(result) //7

 


공부하는데 도움을 준 사이트

 

전반적인 공부 가이드라인

yagom.net

 

야곰닷넷 - yagom.net

iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.

yagom.net

공식 스위프트 언어 가이드 번역 사이트

jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures

 

클로저 (Closures)

 

jusung.gitbook.io

 

클로저 추가 참고

seorenn.blogspot.com/2014/06/swift-closures.html

 

Swift - 클로져(Closures)

iOS 및 macOS 용 앱 개발, Emacs, Vim, Python 위주로 다루는 Seorenn 개인 블로그

seorenn.blogspot.com

 

클로저 추가 참고2

medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-closure-aa401f76b7ce

 

반응형