Closure 선언
다음과 같이 closure를 선언할 수 있다.
// 두개의 정수를 받아 곱한 결과를 반환하는 closure이다.
// 정석대로 closure를 선언하였다.
var multiplyClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a*b
}
// 간략하게 closure를 선언하였다.
var simipleMultiplyClosure: (Int, Int) -> Int = { a, b in
return a * b
}
closure는 아래와 같이 사용할 수 있다.
func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
let result = operation(a,b)
return result
}
operateTwoNum(a: 4, b: 2, operation: multiplyClosure)
var addClosure: (Int, Int) -> Int = {a, b in
return a + b
}
operateTwoNum(a: 4, b: 2, operation: addClosure)
// 즉석으로 closure 내용으로 구현하여 함수 파라미터로 넘겨줄 수 있다.
operateTwoNum(a: 4, b: 2) { a, b in
return a / b
}
operateTwoNum() 함수는 두 개의 정수값을 받아 operation 함수를 이용하여 값을 계산하여 반환한다.
구현된 closure(multiplyClosure, addClosure)를 인수로 넘겨줘도 되지만, 함수 호출 시 closure를 즉석으로 구현하여 넘겨줄 수도 있다.
Closure Expression Syntax
{ (parameters) -> returnType in
statements
}
in 키워드를 기준으로 앞에는 파라미터와 리턴 타입, 뒤에는 로직이 나온다.
// Example1. 초간단 closure
let choSimpleClosure = {
} // 파라미터, 리턴 타입, statement도 없는 클로저
choSimpleClosure()
// Example2. 코드블록을 구현한 closure
let choSimpleClosure2 = {
print("Hello, 클로져, 코로나 바이!")
}
choSimpleClosure2()
// Example3. 인풋 파라미터를 받는 closure
let inputClosure: (String) -> Void = { name in
print("Hello, 클로져, 코로나 바이! 나의 이름은 \(name)입니다.")
}
inputClosure("Dew")
// Example4. 값을 리턴하는 closure
let returnClosure: (String) -> String = { name in
let message = "iOS 개발 만만세, \(name)님 경제적 자유를 얻으실 거에요!"
return message
}
let value = returnClosure("Dew")
print(value)
// Example5. closure를 파라미터로 받는 함수 구현
func someSimpleFunction(choSimpleClosure: () -> Void) {
print("함수에서 호출이 되었어요.")
choSimpleClosure()
}
someSimpleFunction(choSimpleClosure: {
print("바이 코로나 from closure")
})
// Example6. Trailing closure
func trailingClosureFunction(message: String, choSimpleClosure: () -> Void){
print("함수에서 호출됨. 메시지는 \(message)")
choSimpleClosure()
}
trailingClosureFunction(message: "로나로나 코로나 극혐", choSimpleClosure: {
print("바이 코로나 from closure")
})
trailingClosureFunction(message: "로나로나 코로나 극혐") {
print("바이 코로나 from closure")
} // 맨마지막 클로저를 생략하여 이렇게 사용할 수 있다. 코드 작성을 할 때 코드를 간소화 보여주므로 깔끔한 코드 작성 가능!!
Capturing Value
Scope
안쪽에서 선언한 변수 및 상수는 지역변수이므로, 중괄호를 벗어나는 바깥쪽 코드에서는 접근할 수 없다.

안쪽 scope는 바깥쪽 scope에 접근할 수 있지만, 역으로는 불가능하다.
그런데 다음과 같은 경우를 보자. printClosure는 조건문 안에 선언된 지역변수인 name을 print한다.
name은 지역변수이므로 조건문 중괄호를 벗어나는 순간 사라진다. 하지만 closure는 지역변수가 아니므로 중괄호를 벗어나도 여전히 사용할 수 있다. 이때, 중괄호를 벗어나도 printClosure는 print(name)을 수행할 수 있을까?

정답은 YES이다!! 클로저한테 잡혀서 바깥 scope에서 사용할 수 있는 값을 Capturing value라고 한다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'iOS > iOS 앱 개발 올인원 패키지 Online' 카테고리의 다른 글
[iOS] 패스트캠퍼스 챌린지 17일차 - Structure(2).예제 (0) | 2021.09.22 |
---|---|
[iOS] 패스트캠퍼스 챌린지 16일차 - Structure(1). Structure vs. Class (0) | 2021.09.21 |
[iOS] 패스트캠퍼스 챌린지 14일차 - Closure(1) (0) | 2021.09.19 |
[iOS] 패스트캠퍼스 챌린지 13일차 - Collection(2). Dictionary & Set (0) | 2021.09.18 |
[iOS] 패스트캠퍼스 챌린지 12일차 - Collection(1). Array (0) | 2021.09.17 |
Closure 선언
다음과 같이 closure를 선언할 수 있다.
// 두개의 정수를 받아 곱한 결과를 반환하는 closure이다.
// 정석대로 closure를 선언하였다.
var multiplyClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a*b
}
// 간략하게 closure를 선언하였다.
var simipleMultiplyClosure: (Int, Int) -> Int = { a, b in
return a * b
}
closure는 아래와 같이 사용할 수 있다.
func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
let result = operation(a,b)
return result
}
operateTwoNum(a: 4, b: 2, operation: multiplyClosure)
var addClosure: (Int, Int) -> Int = {a, b in
return a + b
}
operateTwoNum(a: 4, b: 2, operation: addClosure)
// 즉석으로 closure 내용으로 구현하여 함수 파라미터로 넘겨줄 수 있다.
operateTwoNum(a: 4, b: 2) { a, b in
return a / b
}
operateTwoNum() 함수는 두 개의 정수값을 받아 operation 함수를 이용하여 값을 계산하여 반환한다.
구현된 closure(multiplyClosure, addClosure)를 인수로 넘겨줘도 되지만, 함수 호출 시 closure를 즉석으로 구현하여 넘겨줄 수도 있다.
Closure Expression Syntax
{ (parameters) -> returnType in
statements
}
in 키워드를 기준으로 앞에는 파라미터와 리턴 타입, 뒤에는 로직이 나온다.
// Example1. 초간단 closure
let choSimpleClosure = {
} // 파라미터, 리턴 타입, statement도 없는 클로저
choSimpleClosure()
// Example2. 코드블록을 구현한 closure
let choSimpleClosure2 = {
print("Hello, 클로져, 코로나 바이!")
}
choSimpleClosure2()
// Example3. 인풋 파라미터를 받는 closure
let inputClosure: (String) -> Void = { name in
print("Hello, 클로져, 코로나 바이! 나의 이름은 \(name)입니다.")
}
inputClosure("Dew")
// Example4. 값을 리턴하는 closure
let returnClosure: (String) -> String = { name in
let message = "iOS 개발 만만세, \(name)님 경제적 자유를 얻으실 거에요!"
return message
}
let value = returnClosure("Dew")
print(value)
// Example5. closure를 파라미터로 받는 함수 구현
func someSimpleFunction(choSimpleClosure: () -> Void) {
print("함수에서 호출이 되었어요.")
choSimpleClosure()
}
someSimpleFunction(choSimpleClosure: {
print("바이 코로나 from closure")
})
// Example6. Trailing closure
func trailingClosureFunction(message: String, choSimpleClosure: () -> Void){
print("함수에서 호출됨. 메시지는 \(message)")
choSimpleClosure()
}
trailingClosureFunction(message: "로나로나 코로나 극혐", choSimpleClosure: {
print("바이 코로나 from closure")
})
trailingClosureFunction(message: "로나로나 코로나 극혐") {
print("바이 코로나 from closure")
} // 맨마지막 클로저를 생략하여 이렇게 사용할 수 있다. 코드 작성을 할 때 코드를 간소화 보여주므로 깔끔한 코드 작성 가능!!
Capturing Value
Scope
안쪽에서 선언한 변수 및 상수는 지역변수이므로, 중괄호를 벗어나는 바깥쪽 코드에서는 접근할 수 없다.

안쪽 scope는 바깥쪽 scope에 접근할 수 있지만, 역으로는 불가능하다.
그런데 다음과 같은 경우를 보자. printClosure는 조건문 안에 선언된 지역변수인 name을 print한다.
name은 지역변수이므로 조건문 중괄호를 벗어나는 순간 사라진다. 하지만 closure는 지역변수가 아니므로 중괄호를 벗어나도 여전히 사용할 수 있다. 이때, 중괄호를 벗어나도 printClosure는 print(name)을 수행할 수 있을까?

정답은 YES이다!! 클로저한테 잡혀서 바깥 scope에서 사용할 수 있는 값을 Capturing value라고 한다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'iOS > iOS 앱 개발 올인원 패키지 Online' 카테고리의 다른 글
[iOS] 패스트캠퍼스 챌린지 17일차 - Structure(2).예제 (0) | 2021.09.22 |
---|---|
[iOS] 패스트캠퍼스 챌린지 16일차 - Structure(1). Structure vs. Class (0) | 2021.09.21 |
[iOS] 패스트캠퍼스 챌린지 14일차 - Closure(1) (0) | 2021.09.19 |
[iOS] 패스트캠퍼스 챌린지 13일차 - Collection(2). Dictionary & Set (0) | 2021.09.18 |
[iOS] 패스트캠퍼스 챌린지 12일차 - Collection(1). Array (0) | 2021.09.17 |