728x90
Swift 스터디. 3번째
고차원 함수들 (Higher Order Functions)
1. Map
func map<T>(_ transform: (Int) throws -> T) rethrows -> [T]
배열 원소들을 하나하나 변환해주는 함수다. transform 자리에 클로저를 넣어준다.
2. Filter
func filter(_ isIncluded: (Int) throws -> Bool) rethrows -> [Int]
Bool을 반환하는 클로저로 True 인 것만 배열로 반환해준다.
3. Reduce
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Int) throws -> Result) rethrows -> Result
첫 번째 매개변수는 초기 결과값을 설정한다. nextPartialResult 에서 첫 번째 인수로 지금까지 연산한 결과값이 들어간다. 두 번째 인수는 새로 연산할 값이 들어간다. 그 클로저 안에서 결과값을 갱신할 연산을 진행해 반환한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | let arr: [Int] = [0, 1, 2, 3, 4, 5, 6] var newArr: [Int] = arr.map( { (value: Int) -> Int in return value * 5 }) newArr = arr.map( { (value:Int) in return value * 5} ) newArr = arr.map( {value in value * 5}) newArr = arr.map( { $0 * 5 }) print ("\(newArr)") newArr = arr.filter({(value: Int) -> Bool in return (value % 2 == 0)}) newArr = arr.filter({ $0 % 2 == 0 }) print ("\(newArr)") var newArr2 = arr.reduce(0, { (s1:Int, s2:Int) -> Int in return s1 + s2}) newArr2 = arr.reduce(0, { s1, s2 in s1 + s2}) newArr2 = arr.reduce(0, { $0 + $1 }) print ("\(newArr2)") // 실행 결과 [0, 5, 10, 15, 20, 25, 30] [0, 2, 4, 6] 21 | cs |
@autoclosure 과 @escaping
@autoclosure
함수 호출 시 클로저 형식인 중괄호 { }를 사용하지 않게 해준다. 자동으로 Closure 형식으로 변경해준다.
1 2 3 4 5 6 7 8 9 | var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] // customersInLine is ["Ewa", "Barry", "Daniella"] func serve(customer customerProvider: @autoclosure () -> String) { print("Now serving \(customerProvider())!") } serve(customer: customersInLine.remove(at: 0)) // Prints "Now serving Ewa!’ | cs |
@escaping
함수에서 반환한 클로저를 해당 함수 범위 밖으로 저장하려면, @escaping 키워드를 붙여줘야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] // customersInLine is ["Barry", "Daniella"] var customerProviders: [() -> String] = [] func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) { customerProviders.append(customerProvider) } collectCustomerProviders(customersInLine.remove(at: 0)) collectCustomerProviders(customersInLine.remove(at: 0)) print("Collected \(customerProviders.count) closures.") // Prints "Collected 2 closures." for customerProvider in customerProviders { print("Now serving \(customerProvider())!") } // Prints "Now serving Barry!" // Prints "Now serving Daniella! | cs |
클래스와 구조체 차이
클래스와 구조체는 같은 듯 하면서도 다르다.
둘의 공통점은 다음과 같다.
- 데이터를 저장하는 속성을 정의할 수 있다.
- 기능을 제공해주는 메소드들을 정의할 수 있다.
- 값들을 제공하기 쉽게 SubScript 기능을 정의할 수 있다. 예를 들면 배열의 []
- 초기 상태를 설정하는 생성자 Initializers 를 정의할 수 있다.
- 기본 구현을 토대로 Extension 이 가능하다.
- 프로토콜을 적용할 수 있다.
여기에 클래스는 다음과 같은 기능을 제공한다.
- 상속이 가능하다.
- 타입 캐스팅이 런타임 중에 가능하다.
- 소멸자 (Deinitializers) 를 정의해, 자원들을 해제할 수 있다.
- 참조 (Reference) 가 가능하다.
Lazy 속성들
lazy 키워드가 붙은 속성은 처음, 그 속성을 사용하기 전까지는 연산을 하지 않는다.
그 속성을 처음 사용할 때 초기화가 진행된다. 초기화 되는 시점을 지정할 수 있다는 점에서 매우 유용하다.
종종 속성이 외부 요인에 의존할 때, 그 요인들을 먼저 처리하고 초기화를 해준다.
'iOS > iOS 자료실' 카테고리의 다른 글
[오류] Could not insert new outlet connection 해결법 (2) | 2018.08.03 |
---|---|
Swift(iOS) 스터디. 5번째 SQLite (0) | 2018.06.03 |
Swift 스터디. 4번째 (0) | 2018.05.19 |
Swift 스터디. 4월 둘째주 (0) | 2018.04.15 |
Swift 스터디. 4월 첫째주 (0) | 2018.04.08 |
댓글