-
Swift4 : 클로저: Closure: #표현방식: #왜필요해?: #효율적: #간결성: #생략스위프트: Swift/스위프트: 언어자체: 문법 2018. 9. 20. 09:05
안녕하세요 ! 씩이 입니다!
저는 Swift 와 iOS 를 공부하고 연구하는 학생입니다.
같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다.
제 3자가 있다고 가정하고 설명하기 때문에 존대를 하지 않는점 이해 부탁드립니다.
공유가 미래 라고 생각합니다.
한국의 모든 개발자분들 존경합니다!
- Swift version : Swift 4.2 Swift 언어
- 참고한 것들
- 씩이 Github
- 자료구조 소스파일 있습니다.
- iOS 관련 자료들, 정보들 정리해 두었습니다.
- 스위프트로 구현한 자료구조 : DataStructures in Swift4
- Swift4 : 연결리스트 (1 / 3) : #LinkedList : #DataStructrue : #자료구조
- Swift4 : 연결리스트 (2 / 3) : #LinkedList : #값 추가하기, push, append : #값 삽입하기,insert
- Swift4 : 연결리스트 (3 / 3) : #LinkedList : #값 제거하기, pop, removeLast, remove(at: )
- [스위프트 : 자료구조] 스택: Stack: 자료구조: DataStructure: 쌓기
- [스위프트 : 자료구조] 스택 : Stack : 프로토콜 지향 스택 구현하기
- [스위프트 : 자료구조] 큐 (1 / 4): Queue: #자료구조: #배열로 구현한 큐: #배열의원리
- [스위프트 : 자료구조] 큐 (2 / 4): Queue: #자료구조: #연결리스트: #더블연결리스트: #DoublyLinkedList
- [스위프트 : 자료구조] 큐 (3 / 4): Queue: #자료구조: #Stack으로 구현: #더블스택: #DoubleStack: #제일좋음
- [스위프트 : 자료구조] 큐 (4 / 4): Queue: #자료구조: #RingBuffer: #링버퍼로 구현한 큐: #고정된배열: #마지막!!
- [스위프트 : 자료구조] 큐: Queue: 프로토콜 지향 큐 구현하기
- 스위프트: 트리: Tree: #자료구조: #깊이우선탐색: #레벨정렬탐색: #검색알고리즘: Swift4
- 스위프트: 이진 탐색 트리(1 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- 스위프트: 이진 탐색 트리(2 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- [스위프트 : 자료구조] AVL Tree: 자가 균형 트리: #balance: #트리의 높이: #rotation메소드: #성능오짐
- [스위프트:자료구조] 트라이: Trie: 문자열 찾기: 단어 찾기
- [스위프트:자료구조] Heap: 힙 자료구조 (1 / 2) : Heap 이란?
- [스위프트:자료구조] Heap: 힙 자료구조 (2 / 2) : Heap 구현하기
- 스위프트로 구현한 알고리즘 : Algorithms in Swfit4
- [스위프트 : 알고리즘] 재귀호출 (1 / 6) : recursive: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 팩토리얼 (2 / 6) : factorial: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 거듭제곱 (3 / 6) : Power: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 피보나치 수열(4 / 6) : Fibonacci: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 하노이의 탑 (5 / 6) : Hanoi: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 최대공약수 (6 / 6) : GCD: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트:알고리즘] 이진 탐색[1 / 3]: Binary Search: 이진 탐색이 뭐야?
- [스위프트:알고리즘] 이진 탐색[2 / 3]: Binary Search: 이진 탐색: 반복문, 재귀호출로 구현하기
- [스위프트:알고리즘] 이진 탐색[3 / 3]: Binary Search: 이진 탐색: 프로토콜 지향으로 구현하기
- Swift 주제별 분류
- Swift4 : 제어 전달 명령문( Control Transfer Statement ) : #continue, #break, #return 키워드
- Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #참조타입, 값 타입 : #===
- Swift4 : 프로퍼티 : #Property : #get, set : #willSet, didSet
- Swift4 : 메소드 : #Method : #영향력 범위 : #self : #mutating : #값타입 수정
- Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이트 패턴 전처리 (1 / 2)
- Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)
- Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기
- Swift4 : 자동 참조 카운팅 : #Automatic Referece Counting : #ARC :#강한참조 : #Strong Reference Cycle : #메모리 누수
- Swift4 : 클로저: Closure: #표현방식: #왜필요해?: #효율적: #간결성: #생략
- [스위프트 : 기초] 서브스크립트 : Subscript : 지름길
클로저 : Closures
- What is Closures ?
- 애플이 이야기 하는 클로저는 이렇습니다.
- Closures are self-contained blocks of functionality that can be passed around and used in your code.
- 클로저는 코드에서 사용할 수 있고, 주변으로 전달될 수 있는 기능을 가진 블록이다.
- 함수를 간단하게 간편화 시킨 것으로 '이름 없는 일회용 함수' 라고 생각해도 됩니다.
- 표현방식 ( Syntax )
- 아래 그림을 보시면 in 을 기준으로 '어떤 형식으로 정의되는지' 와 '실행문' 이 나눠집니다.
- { (매개 변수) -> 반환 타입 in
- 실행문
- }
- 클로저가 왜 필요?
- 간단하고 간편하게 만든 일회용 함수가 왜 필요할까요?
- 함수가 다른 곳의 매개변수로 전달되야 할 때 유용합니다.
- Swift Standard Library 의 sort(by:) 메소드로 예를 들어 보면 다음과 같습니다.
1234let numbers = [1,2,3,4] // 배열이죠var reversedNumbers = numbers.sorted(by: (Int, Int) throws -> Bool) // 인자값으로 함수 요구.// 다음과 같이 sorted(by:) 메소드는 인자값에 두 개의 Int 매개변수와 Bool 타입의 반환값을 가지는 함수를 요구합니다.cs - 이럴 때 인자값으로 요구사항에 맞추어 함수를 넣어도 무방합니다.
- 하지만 다시 쓰지 않을 일회용 함수를 굳이 따로 정의하고 쓰지 않고 '클로저' 라는 방식으로 일회용 함수를 정의해서 사용하는게 매우 편함^^
- 매개변수로 클로저와 일반함수 비교해서 넣어보기
- 일반 함수
- 다시 사용하지도 않을 함수 backward 를 정의해서 비효율적이고 불필요함.
1234567let numbers = [1,2,3,4] // 배열이죠func backward(_ s1:Int, _ s2:Int ) -> Bool{return s1 > s2 // 앞의 수가 뒤의 수보다 더 크게.}var reversedNumbers = numbers.sorted(by: backward)// [4, 3, 2, 1] 출력됩니다.cs - 클로저
- 그냥 넣으면 되쥬? 이래서 씁니다.
12var reversedNumbers = numbers.sorted(by: { (s1:Int,s2:Int) -> Bool in return s1 > s2 })// 마찬가지로 [4, 3, 2, 1]cs - 생략
- 실제 코드에선 위에서 작성한 클로저도 길어서 잘 안씁니다.
- Swift 의 타입추론 기능으로 인해 더 줄일 수 있습니다. 순서대로 더 간결하게 생략하겠습니다!
- 1. 매개변수 타입과 반환타입 생략하기
1234567let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] // String 타입의 배열var reversedName = names.sorted(by: { (s1,s2) in return s1 > s2 })// ["Ewa", "Daniella", "Chris", "Barry", "Alex"] 출력됨 => 자료형을 생략해도 String 을 추론함.let numbers = [1,2,3,4] // Int 타입의 배열var reversedNumbers = numbers.sorted(by: { (s1,s2) in return s1 > s2 })// [4, 3, 2, 1] 출력됨. Int 임을cs - 2. 반환 키워드 return 까지 생략해보자,.
- 조건이 있습니다. 클로저가 하나의 명령문만 존재해야 합니다.
- 여러 줄, 혹은 여러 개의 명령문이 있다면 무엇이 반환 타입인지 모호하므로 return 타입을 추론하지 못합니다.
- 하지만 하나의 명령문만 존재하고, 요구사항에 Bool 타입의 반환값이 있다면 모호성이 없어지고 존재하는 하나의 명령문이 return 이 되는 것이죠.
12var reversedNumbers_shortReturn = numbers.sorted(by: { (s1,s2) in s1 > s2 }// 명령문이 한 줄(s1 > s2) 이므로 return 생략cs - 3. '매개변수 이름' 까지 생략해보자.
1234var reversedNumbers_shortArgue = numbers.sorted(by: { $0 > $1 })// 요구 사항에서 매개변수가 두 개로 정해져 있으므로 매개변수 까지 생략가능// $0 은 첫 번째, $1 은 두 번째 매개변수를 가리킵니다.// 마찬가지로 [4, 3, 2, 1] 출력.cs - 4. '매개변수 자체' 를 생략해보자
1234var reversedNumbers= numbers.sorted(by: > )// 매개 변수 까지 없애 버림..// 이게 가능한 이유는 String 구조체가 '>' 라는 메소드를 가지고 있기 때문입니다.// > 메소드는 두 개의 매개변수가 있고 반환타입이 Bool 이므로 여기에 쓸 수 있습니다.cs - 정리하면 이렇습니다.
- 클로저는 이름없는 일회성 블록으로 함수처럼 사용이 가능하고
- 함수보다 효율적인 코드 작성이 가능하기 때문에 사용하며
- 매개변수나 반환 타입 등을 상황에 맞게 생략해서 매우 간결하게 표현이 가능하다.
'스위프트: Swift > 스위프트: 언어자체: 문법' 카테고리의 다른 글
[스위프트 : 기초] 서브스크립트 : Subscript : 지름길 (0) 2018.10.08 Swift4 : 자동 참조 카운팅 : #Automatic Referece Counting : #ARC :#강한참조 : #Strong Reference Cycle : #메모리 누수 (0) 2018.09.10 Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기 (0) 2018.09.08 Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2) (0) 2018.09.07 Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이션 : #델리게이트 패턴 ( 1 / 2 ) (0) 2018.09.07 댓글