코딩하는 제리

[Swift] swift 클로저 본문

iOS/SwiftUI

[Swift] swift 클로저

JerryCho 2022. 1. 3. 17:48

// 클로저는 Named 클로저, Unnamed 클로저 두 종류
// 일반적으로 함수를 만드는 자체가 Named 클로저이다. 편의상 함수라고 부름.
// 이름이 없는 함수를 익명함수. 즉, Unnamed 클로저라고 함.
// 보통 Unnamed 클로저를 그냥 클로저라고 부른다.

// 파라미터와 리턴이 없는 클로저
let closure = { () -> () in
	print("Closure")
}

// 파라미터와 리턴이 있는 클로저
let closure = { (name: String) -> String in
	return "Hello, \(name)"
}
closure("jerry")
// 클로저에서는 Argument Label을 사용하지 않는다. 오로지 Parameter Name
closure(name: "jerry") // 에러

// 클로저를 변수나 상수에 대입 가능
let closure = { () -> () in
	print("Closure")
}
let closure2 = closure	// 가능

// 함수의 파라미터 타입으로 클로저 전달 가능
// 파라미터로 함수를 넘겨줘도 되지만
func doSomething(closure: () -> ()) {
	closure()
}
// closure 라는 파라미터에 클로저로 바로 넘겨줘도 된다.
doSomething(closure: { () -> () in
	print("Hello")
})

// 함수의 반환 타입으로 클로저 사용
func doSomething() -> () -> () {
	return { () -> () in
    	print("Hello")
    }
}

// 클로저 실행
let closure = { () -> String in
	return "Hello"
}
closure()

// 클로저 직접 실행
// 클로저를 소괄호로 감싸고 호출 구문인 () 추가
({ () -> () in
	print("Hello")
})()

클로저 경량 문법

// 클로저를 매개변수로 받는 함수
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
	return method(a, b)
}
var result: Int

// 후행 클로저 (Trailling Closure)
// 파라미터 값 형식이 아닌 함수 뒤에 붙여 작성하는 문법
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
	return left + right
}

// 반환 타입 생략
// calculate 함수의 method 매개변수는
// Int 타입을 반환할 것이라 알고 있기에 -> Int 생략 가능
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
	return left + right
})
// 반환 타입 생략 + 후행 클로저
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
	return left + right
}

// 단축 인자 이름
// 클로저의 매개변수 이름이 굳이 필요없다면 사용 가능
// 단축 인자 이름은 클로저의 매개변수의 순서대로 $0, $1... 처럼 표현 가능
// in 제거 가능
result = calculate(a: 10, b: 10, method: {
	return $0 + $1
})
// 단축 인자 이름 + 후행 클로저
result = calculate(a: 10, b: 10) {
	return $0 + $1
}

// 암시적 반환 표현
// 클로저가 반환하는 값이 있다면
// 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급
result = calculate(a: 10, b: 10) { $0 + $1 }

// 축약 전
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) -> Int in
	return left + right
})
// 축약 후
result = calculate(a: 10, b: 10) { $0 + $1 }
print(result)	// 20

 

'iOS > SwiftUI' 카테고리의 다른 글

[Swift] swift 클로저 캡쳐  (0) 2022.01.07
[Swift] swift 클로저 - @autoclosure, @escaping  (0) 2022.01.04
[Swift]열거형(enum)/rawValue  (0) 2022.01.03
[Swift] swift 구조체/클래스  (0) 2022.01.03
[Swift] swift 조건문/반복문  (0) 2022.01.03
Comments