일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- queue
- HTML
- 리액트
- 자바스크립트
- 비동기
- 계명대
- 자스민
- Svelte
- IOS
- 개발자
- hokeys
- jest
- react
- 호키스
- 힛잇
- 스벨트
- 스위프트
- 자바스크립트 자료구조
- hokidoki
- 이종호
- 자료구조
- 계명대 이종호
- 개발
- data structure
- TDD
- 리액트 예제
- javascript
- SWIFT
- Hitit
- 호키도키
Archives
- Today
- Total
Dog foot print
[SWIFT] CLOSURE 본문
클로져란 ?
보통 다른 프로그래밍 언어를 배울 때 Closure
를 의미하는 것은 함수가 스코프가 유지 되었을 경우, 함수 내부에 있는 변수는 메모리에서 해제 되지 않는 것
을 의미하는데, 이는 소프트웨어 아키텍쳐
적인 의미의 클로져이다.
swift
에서의 클로져는 익명 함수
를 의미 합니다. 익명함수는 재사용 할 가능성이 적어 특정 코드 부분에서만 사용 되는 코드 집합으로, 콜백 패턴
과 더불어 사용해서 함수 내부에 필요한 시기에 코드를 실행 할 수 있다는 장점이 존재합니다.
스위프트에는 다음과 같은 3개의 클로저 객체가 존재합니다.
- 전역 함수
- 이름이 있으며 주변 환경에서 캡처할 어떤 값도 없는 클로저
- 중첩 함수
- 이름이 있으며 자신을 둘러싼 함수로부터 값을 캡처할 수 있는 클로저
- 클로저 표현식
- 이름이 없으며 주변 환경으로부터 값을 캡처할 수 있는 경량 문법으로 작성된 클로져이다.
클로저 표현식
/*
*{ (매개 변수) -> 반환 타입 in
* 실행할 구문
*}
*/
import UIKit
func sum(x : Int, y : Int) -> Int{
return x + y;
}
let a = 10;
let b = 20;
let c = sum(x: a, y: b)
let d = { (x : Int , y : Int) -> Int in
return x + y;
}
let e : Int = d(a, b);
클로저 표현식은 함수와 달리 생략되는 부분이 많다. 그렇지만 클로저 또한 함수
이기 때문에, 그리 무서워 할 필요가 없다.
TIP :
보통 클로저는 재사용 보다는 함수의 콜백으로 사용될 1회성 함수 이기 때문에 위와 같이 변수에 붙여 사용하는 행위는 적다.
콜백으로 사용되는 클로저 표현식
// 함수를 정의하고 사용하기
var numbers = [10,20,4,3,2,6,9,11];
let dsc = { (x : Int , y : Int ) -> Bool in
return x > y
}
numbers.sort(by: dsc)
//함수를 직접 전달인자에 작성하여 전달하기
numbers.sort(by: {(x : Int, y : Int ) -> Bool in
return x < y;
})
콜백으로 사용되는 클로저는 아까 위와 같이 변수에 클로저를 할당한다음 이를 전달인자로 넘겨 줄 수 있고, 콜백 파라메터에 직접 클로저를 작성하여 사용이 가능하다.
클로저 단축 문법
import UIKit
// 함수를 정의하고 사용하기
var numbers = [10,20,4,3,2,6,9,11];
//한줄로 작성하기
numbers.sort(by: {(x : Int , y : Int) -> Bool in return x > y})
//반환값을 작성하지 않고, 컴파일러가 추측 하게 하기
numbers.sort(by: {(x : Int , y : Int ) in return x < y});
//() -> 생략하기
numbers.sort(by: {x , y in return x > y});
//return 생략하기 한줄인 경우에
numbers.sort(by: {x , y in x > y});
//타입을 명시 했을 경우에 클로져의 매개변수와 반환 값의 타입을 명시해주지 않아도 된다.
let myScore : (Int) -> String =
{ (a) in "\(a)점" }
//매개변수를 추측하여, 반환값만 명시하기
//$0은 매개변수로 전달된 0번째 파라메터를 의미한다.
numbers.sort(by: {return $0 > $1})
//sort 함수만이 사용가능한 극강의 단축 표현식
numbers.sort(by: >)
트레일링 클로저
import UIKit
var numbers = [10,20,4,3,2,6,9,11];
numbers.sort(){
(x : Int , y : Int ) -> Bool in
return x > y
}
print(numbers)
numbers.sort{
(x : Int , y : Int ) -> Bool in
return x > y
}
트레일링 클로저는 마지막 파라메터의 타입이 클로져를 지원 하는 경우에만 사용이 가능합니다. 만약 인자값이 클로저를 제외하고는 파라메터가 존재하지 않을 때는 함수 호출자 또한 제거하고 테일링 클로저를 사용 할 수 있습니다.
Auto closure
import UIKit
func condition(condition : @autoclosure () -> Bool, success : @autoclosure () -> Void, failed : @autoclosure () -> Void){
if condition() == true {
success()
}else{
failed()
}
}
condition(condition : (10 < 5), success: print("good"), failed: print("fail"));
autoclosure는 일반 구문을 클로저로 자동 변경해주어서 문법을 조금 더 단축 할 수 있는 장점을 가질 수 있습니다.
반응형
'IOS > Swift' 카테고리의 다른 글
[SWIFT] 프로퍼티 (0) | 2021.07.13 |
---|---|
[SWIFT] 구조체와 클래스 (0) | 2021.07.13 |
[Swift] Inout (0) | 2021.07.08 |
[SWIFT] 함수 시작하기 (0) | 2021.07.07 |
[SWIFT] Optional (0) | 2021.07.05 |
Comments