변형 기존 컨테이너값은 변경되지않고 새로운 컨테이너 반환 for - in구문과 큰차이가 없음 컴파일러 최적화 측면에서 성능이 좋음 코드 재사용 용이
let optionalArr: [Int?] = [1,2,nil,5]
let mapped = optionalArr.map{ $0 }
print(mapped)
/*
[Optional(1), Optional(2), nil, Optional(5)]
*/
추출 flat deprecated ➡️ instead use to compactMap
let optionalArr: [Int?] = [1,2,nil,5]
let compactmapped = optionalArr.compactMap{ $0 }
print(compactmapped)
/*
[1, 2, 5]
*/
true이면 값을 포함, false이면 미포함 시키며 새로운 컨테이너를 생성해서 반환한다.
let optionalArr: [Int?] = [1,2,nil,5]
let filtered = optionalArr.compactMap{$0}.filter{$0>2}
print(filtered)
// [5]
map은 새로운 컨테이너를 반환을 하지만 forEach는 블럭내에서만 동작하고 반환값이 없다.
optionalArr.forEach { print($0) }
/*
Optional(1)
Optional(2)
nil
Optional(5)
*/
결합 초기값설정가능, 초기값은 처음 $0에 들어간다. 컨테이너 내부를 하나로 합쳐주는 기능
let sumReduce2 = reduceNum.reduce(3) { $0 + $1 }
// 9
- 상자, 껍데기
- Swift의 Optional 같이 값이 있을 수 도있고, 없을 수 도있는 값을 넣는 상자라고 비유 할 수 있다.
- 어떠한 값을 넣을 수 있는 상자 라고 표현한다.
- 함수객체
- 고차함수 map을 적용 할 수 있는 컨테이너 타입
- Context값이 있는지 없는지 모르고 상자를 열어봐야 알수 있다.
- 서로 다른 타입이기 때문에 Int? 와 Int는 연산 할 수 없다. 그래서 이것을 꺼내는 작업이 map
-
무엇으로도 나눌 수 없는 궁극적인 실체
-
함수 객체의 일종 ➡️ 모나드에는 map을 적용 할 수 있다. 여기에 Context개념을 더한것
-
모나드는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 함수객체 타입 ➡️ 모나드는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 map을 적용 할 수 있는 타입
-
Optional은 모나드 즉, Optional은 함수객체이면서 모나드이다.