Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- til
- Input Output
- SWIFT
- CoreData
- UserDefaults
- 양궁대회
- firebase
- 테이블뷰 나누기
- 강한 참조 순환
- ReferceCycle
- 롤케이크 자르기
- 면접을 위한 CS 전공 지식 노트 Tree
- class struct
- TableView
- 면접을 위한 CS전공 지식 노트
- Reference Cycle
- tableview section별 다른 cell적용
- 프로그래머스
- coremotion
- NavigationSearchBar
- TableView Section
- Value Type Reference Type
- @escaping
- Array vs Linked List
- CarouselCollectionview
- retain cycle
- wil
- Carousel CollectionView
- 자료구조
- UIKit
Archives
- Today
- Total
개발하는 동글 :]
[TIL],[Swift],[Closure정리하기] 본문
1. Closure?
Unnamed Closure와 Named Closure를 둘 다 포함
1.1 Named Closure, Unnamed Closure
- Named Closure : 평소와 같이 선언해 왔던 함수
func doSomething() {
print("Somaker")
}
- Unnamed Closure : 이름을 붙이지 않고 사용하는 함수
let closure = { print("Somaker") }
1.2 스위프트는 함수를 일급객체로 취급한다.
- 일급객체로 취급한다면?
- 함수를 변수에 할당할 수 있음
- 함수를 호출할 때 함수를 파라미터로 전달할 수 있음
- 함수에서 함수를 반환할 수 있음
2. Closure의 형태
{(Parameters) -> (Return Type) in
실행구문
return (Return Type)
}
{(Parameters) in
실행구문
return (Return Type)
}
- 예시 코드
var aType = {(a:Int, b:Int) -> Int in
return a + b
}
var bType = {(a:Int, b:Int) in
return a + b
}
aType(1,2) //Argument Label 없음
bType(1,2) //Argument Label 없음
- 클로저에서는 Argument Label을 사용하지 않는다. 따라서 a, b는 오직 Parameter Name이다
2.1 Trailing Closure(후행 클로저)
func doSomething(closure: () -> ()) {
closure()
}
이러한 Closure를 파라미터로 받는 함수가 있다고 가정해 보자.
//호출
doSomething(closure: { () -> () in
print("Hello!")
})
기존의 표현식을 사용한 함수 호출은 이런 식으로 표현해야 했다.
이처럼 클로저가 파라미터의 값 형식으로 함수 호출 구문 안에 작성되어 있는 것을 Inline Closure라고 부른다.
하지만 이 경우 가독성이 좋지 않다.
doSomething () { () -> () in
print("Hello!")
}
하지만 이런식으로 Trailing Closure 방식을 사용한다면 함수의 가장 마지막에 클로저를 꼬리처럼 덧붙여서 쓸 수 있다.
doSomething { () -> () in
print("Hello!")
}
여기서 파라미터가 클로저 하나일 경우에는 호출구문인 ()도 생략할 수 있다.
2.2 파라미터가 여러 개인 함수
func fetchData(success: () -> (), fail: () -> ()) {
//do something...
}
이러한 파라미터가 여러 개인 함수의 실행을 Inline Closure와 Trailing Closure로 비교해 보자.
- Inline Closure의 경우
fetchData(success: { () -> () in
print("Success!")
}, fail: { () -> () in
print("Fail!")
})
- Trailing Closure의 경우 마지막 파라미터의 클로저는 함수 뒤에 붙여 쓸 수 있다.
fetchData(success: { () -> () in
print("Success!")
}) { () -> () in
print("Fail!")
}
파라미터가 하나가 아니기 때문에 호출구문은 생략이 불가능하다.
- 추후 클로저 단축 문법 정리하기
Reference
https://babbab2.tistory.com/82
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/