iOS/iOS 자료실

Swift 스터디. 3번째

Chipmunks 2018. 5. 19.
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= [0123456]
var newArr: [Int= arr.map( { (value: Int-> Int in return value * 5 })
newArr = arr.map( { (value:Intin 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)")
 
// 실행 결과
[051015202530]
[0246]
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 키워드가 붙은 속성은 처음, 그 속성을 사용하기 전까지는 연산을 하지 않는다.
그 속성을 처음 사용할 때 초기화가 진행된다. 초기화 되는 시점을 지정할 수 있다는 점에서 매우 유용하다.

종종 속성이 외부 요인에 의존할 때, 그 요인들을 먼저 처리하고 초기화를 해준다.


댓글