higher order functions

작성일

higher order functions(고차함수)

names를 가지고 끝에 님을 붙이고싶을때,

let names = ["kim", "lee", "min", "john"]

// map ->
let names2 = names.map { name in
  name + "님"
}

출력하면

["kim님", "lee님", "min님", "john님"] 

이렇게 된다.

글자의 개수로 표현해보면,

let names = ["kim", "lee", "min", "john"]

// map ->
let names3 = names.map { name in
  name.count
}

출력하면

[3, 3, 3, 4]

이렇게 출력된다.

Bool타입으로도 할수가 있다.

let names = ["kim", "lee", "min", "john"]

// map ->
let names4 = names.map{ name in
  name.count > 3
}

출력하면

[false, false, false, true]

이렇게 출력된다.

filter -> 거른다.

let names = ["kim", "lee", "min", "john"]

let filterNames = names.filter { (name) -> Bool in
  name.count > 3
}

filterNames

출력하면

["john"]

이 출력된다. 3보다큰게 “john”하나여가지고 “john”이 나온다.

reduce -> 하나로 뭉친다. or 통합한다.

let names = ["kim", "lee", "min", "john"]

let sumName = names.reduce("") { (first, second) in
  return first + second
}

시작하는값과, 받는값을 정해야한다. 출력하면

"kimleeminjohn"

이렇게 출력이 된다. ““에 시작하고싶은 글자를 넣으면,

let names = ["kim", "lee", "min", "john"]

let sumName = names.reduce("hi") { (first, second) in
  return first + second
}

출력하면

"hikimleeminjohn"

이렇게 앞에 붙어서 출력이 가능하다.
하지만 앞에서 배웠던것 처럼,

let sumName = names.reduce("hi") { (first, second) in
  return first + second
}

이부분은 생략이 가능한다. 생략해보면,

let sumName = names.reduce("hi") { 
  $0 + $1
}

이렇게 생략 가능하다.

숫자에 적용을 해 보면,

let numberArr = [1, 2, 3, 4, 5]
let sumNum = numberArr.reduce(0) { $0 + $1 }
sumNum

출력하면

15

이렇게 나온다. 즉 숫자에 적용해서 사용할 수도 있다.

compactMap(nil을 없앤다.)

let numberArr = [1, 2, 3, 4, 5, nil, 6, nil, 8]
let sumNum = numberArr.reduce(0) { $0 + ($1 ?? 0) }
sumNum

출력하면

[1, 2, 3, 4, 5, 6, 8]

원래 nil이 포함되어 있으면 오류가 뜨지만 이렇게, ($1 ?? 0) 지정해주면 오류가 뜨지않는다.
compactMap은 위에있는 nil자체를 없애고 싶을때 사용한다.

let numberArr = [1, 2, 3, 4, 5, nil, 6, nil, 8]
let numbers = numberArr.compactMap { (num) in 
  retrun num}
}
numbers

출력해보면

[1, 2, 3, 4, 5, 6, 8]

위에와 똑같다. 다시 줄여보면,

let numberArr = [1, 2, 3, 4, 5, nil, 6, nil, 8]
let numbers = numberArr.compactMap { $0 }
numbers

이렇게만 적어도

[1, 2, 3, 4, 5, 6, 8]

이렇게 같은 결과값이 나온다.

flatmap(단순화)

let numbers2 = [[1,2,3], [4, 5, 6]]

let flatNum = numbers2.flatmap{ $0 }
flatNum

출력해보면

[1, 2, 3, 4, 5, 6]

이렇게 2중 구조로 되어있는걸 풀어 줄 수 있다.