###### tags: `2020 Boostcamp` # Day06-학습정리 ### 스스로 확인할 사항 - **함수와 클로저 closure에 대한 정의를 비교해보고, 클로저 선언이나 축약 표현에 대해 학습하고 정리한다.** - 클로저 - C 언어나 Objective-C의 블록, 또는 람다와 유사함 - 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것 - 함수는 클로저의 형태 중 하나이다❗️ - 형태 > * 이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태 > * 이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태 > * 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태 - Example ```swift // Basic expression { (매개변수 목록) -> 반환타입 in 실행 코드 } // 클로저 매개변수를 갖는 함수 func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } // 후행 클로저 result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in return left + right } // 단축 인자이름 result = calculate(a: 10, b: 10) { return $0 + $1 } // 암시적 반환 표현 result = calculate(a: 10, b: 10) { $0 + $1 } ``` - **본인 코드에 순수함수 pure function와 그렇지 않은 함수를 분류하고 정리한다.** \- ClassifierAlpha class와 PrimeAlpha class를 봤을 때, init 에서 number가 초기화 되고 난 뒤 읽기만 한다. 또한 클레스 메서드 들은 이 number 값만을 가지고 결과를 return한다. 따라서 안에 있는 모든 함수가 같은 input에 대해 항상 같은 output을 내기 때문에 모두 pure function이라 할 수 있다. - **본인이 사용하지 않은 고차 함수 higher-order function에 대해 (적어도 3개 이상) 추가적으로 학습하고 예제 코드를 만들고 정리한다.** - CompactMap - Map과 똑같지만 optional handling이 가능하다 ```swift let possibleNumbers = ["1", "2", "three", "////4////", "5"] let mapped = possibleNumbers.map { str in Int(str) } // [1, 2, nil, nil, 5] let compactMapped = possibleNumbers.compactMap { str in Int(str) } // [1, 2, 5] ``` - Sort(Sorted) - Comparable protocol을 따르는 mutable collection의 요소를 정렬한다 ```swift var names = ["Stefano", "Brain", "John", "Kate", "Luca", "Zoe"] names.sort() // ["Brain", "John", "Kate", "Luca", "Stefano", "Zoe"] names.sort(by: >) // ["Zoe", "Stefano", "Luca", "Kate", "John", "Brain"] ``` - Contains - 주어진 Predicate을 만족시키는 요소가 있는지 여부를 반환한다 ```swift var names = ["Stefano", "Brain", "John", "Kate", "Luca", "Zoe"] names.contains { $0.first == "A"} // false names.contains { $0.first == "S"} // true ``` - Partition - 주어진 Predicate을 기준으로 collection의 요소들을 재배치한다 ```swift var numbers = [30, 40, 20, 30, 30, 60, 10] let pivot = numbers.partition(by: { $0 > 30 }) // pivot == 5 (조건에 부합하게 partition이 된 index) // numbers == [30, 10, 20, 30, 30, 60, 40] ``` ### 다같이 확인할 사항 - **객체지향 코드가 읽기 편한가, 함수형 코드가 읽기 편한가 서로의 코드를 보고 자신의 기준에서 토론한다.** 1. 객체지향 코드 * 추상화가 바탕이 되므로 가독성이 비교적 뛰어나다 * 흐름을 파악하기에 용이하다 2. 함수형 코드 * 함수형 페러다임에 익숙하지 않다면 코드 해석 자체가 불가할 것 같다(고차함수, 클로저, 합성함수 등) * 난해한 느낌을 받을 수 있다 - **객체지향 패러다임과 함수형 패러다임 공통점과 차이점을 토론한다.** | | 객체지향 | 함수형 | | :-------: | :------------: | :-------: | | 일급 객체 | 클래스(Object) | 함수 자체 | | 패러다임 | 명령형 | 선언형 |