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 | 31 |
Tags
- 아이폰프로그래밍
- iOS프로그래밍
- 이름
- DesignPattern
- 함수형패러다임
- 개발자
- fp
- CleanCode
- Solid
- 부스트코스
- 클린소프트웨어
- POP
- IOS
- 의도
- Swfit
- OOP
- 의존성
- interface
- 디자인패턴
- 인터페이스
- 네이밍
- 객체지향프로그래밍
- SWIFT
- 클린코드
- 고차함수
- 문법
- 협업
- protocol
- 함수형프로그래밍
- 개발
Archives
- Today
- Total
밤에 쓴 코드
Swift) Closure - 클로저 본문
클로저 - Closures
클로저는 자신이 선언된 컨텍스트로부터 상수나 변수 저장하고, 붙잡아 둘수 있습니다.
클로저의 형태
- 전역함수는 이름을가진 클로저의 형태이고 , 값을 붙잡아 둘 수 없습니다.
- 중첩함수는 이름을 가진 클로저의 형태이고 , 자신을 가지고 있는 함수의 값을 붙잡아 둘 수 있습니다.
- 클로저표현식은 이름을 가지지 않은 클로저의 형태이고 , 자신 주위 컨텍스트의 값을 붙잡아 둘 수 있습니다.
Closure Expression Syntax - 클로저 표현식
{ (parameters) -> return type in statements }
정수형 배열을 문자열 배열로 변환하기
함수를 이용한 정렬
var numbers = [9,3,2,4,1,5,8,7,6,0] func asendingOrder(_ a:Int,_ b:Int) -> Bool { return a < b } numbers.sorted(by: asendingOrder(_:_:))
클로저 표현식으로 정렬
numbers.sorted(by:{ (a:Int,b:Int) -> Bool in return a < b })
매개변수 타입생략
numbers.sorted(by: { a,b in return a < b } ) // sort에 들어올 클로저 타입이 명시 되어 있으므로 생략가능하다.
단일 표현식에서의 반환 생략
numbers.sorted(by:{ a,b in a < b}) // 단순한 표현식일시 return 키워드 생략이 가능하다.
트레일링 클로저 표현
numbers.sorted{ a,b in a < b } // 매개변수로 클로저를 받을시 마지막 매겨변수가 클로저이면 트레일링 클로저로 표현할 수 있다.
속기 이름 표현
numbers.sorted{ $0 < $1 }
Escaping Closures
var store = [ () -> Void ]() func callEscapingClosure(closure: @escaping () -> Void ){ store.append(closure) closure() } store.append{ print(10) } // 탈출 가능한 클로저를 만드는 방법은 외부변수에 저장하는 것입니다.
구조체에서 사용해보기
func callEscapingClosure(closure: @escaping () -> Void ){ store.append(closure) closure() } func callNonEscapingClosure(closure: () -> Void ){ closure() } struct Escaping{ let x = 10 func test(){ callEscapingClosure { print(self.x) // @escaping 에서 self 명시적으로 참조해야 함을 의미합니다 // 외부의 클로저이므로 self 키워드를 붙여주지 않으면 x 의 컨텍스트를 가늠할 수 없다. } callNonEscapingClosure { print(x) } } } Escaping().test()
Auto Closures
- 매개변수를 가지고 있지 않다.
- 호출될 때 까지 실행되지 않는다.
var waitingCustomers = ["부엉이","올빼미","금붕어","병아리","아기상어"]
let currentCustomer = { waitingCustomers.remove(at: 0) } // Auto closure
let newCustomer = { waitingCustomers.append($0) }
func nextCustomer( process: @autoclosure () -> String){
print("현재손님은 \(process())")
}
newCustomer("오리") // 호출되어 실행
print(watingCustomers) // print: ["부엉이", "올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 부엉이
print(watingCustomers) // print: [올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 올빼미
print(watingCustomers) // print: ["금붕어", "병아리", "아기상어", "오리"]
'Swift' 카테고리의 다른 글
Swift ) 제네릭 (0) | 2019.06.17 |
---|---|
Swift) 사용자 정의 연산자 (0) | 2019.06.17 |
Swift) POP - Protocol Oriented Programming (1) | 2019.04.25 |
Swift) Extension - 익스텐션 (0) | 2019.04.25 |
Swift) 옵셔널 - Optional (0) | 2019.04.18 |
Comments