고차함수 : 매개변수로 함수를 갖는 함수
맵 (Map)
맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행해서, 그 결과를 다시 반환해주는 함수이다.
맵을 사용하면 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후, 다시 컨테이너에 담아 반환한다.
이 때 원본 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환된다.
그래서 맵은 기존 데이터를 변형하는 데 많이 사용한다.
map 메소드와 for-in 구문
// for-in 구문 사용
for n in numbers {
doubledNumbers.append(n * 2)
strings.append("\(n)")
}
print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
//map 메소드 사용
doubledNumbers = numbers.map({ (n: Int) -> Int in
return n * 2
})
strings = numbers.map({ (n: Int) -> String in
return "\(n)"
})
print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
// 매개변수 및 리턴 타입 생략
doubledNumbers = numbers.map({ return $0 * 2 })
// 반환 키워드 생략
doubledNumbers = numbers.map({ $0 * 2 })
// 후행 클로저 사용
doubledNumbers = numbers.map { $0 * 2 }
for-in 구문 대비 map 메소드의 장점
코드 재사용 : 파라미터로 전달할 함수를 클로저 상수로 만들어 두면 코드를 재사용하기에 용이하다.
컴파일러 최적화 측면에서 성능이 좋다.
멀티 스레드 환경에서 여러 스레드에서 동시에 컨테이너의 값을 변경하려 하면 예상치 못한 결과가 발생할 수 있는데, 이를 막을 수 있다.
(원본 값을 바로 변경하는 게 아니기 때문에.. 로 추정)
코드 재사용
let evenNumbers: [Int] = [0, 2, 4, 6, 8]
let oddNumbers: [Int] = [1, 3, 5, 7]
let multiplyTwo: (Int) -> Int = { $0 * 2 }
let doubledEvenNumbers = evenNumbers.map(multiplyTwo)
print(doubledEvenNumbers)
let doubledOddNumbers = oddNumbers.map(multiplyTwo)
print(doubledOddNumbers)
필터 (Filter)
필터는 원본 컨테이너의 값을 특정 조건에 맞게 걸러서(=필터링) 새로운 컨테이너에 담아 반환한다.
필터 함수의 매개변수로 전달되는 함수의 리턴 타입은 Bool 이다.
해당 값이 새 컨테이너에 포함될 수 있으면 True를, 그렇지 않으면 False를 리턴한다.
let numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8]
let evenNumbers2: [Int] = numbers.filter { (number: Int) -> Bool in
return number % 2 == 0
}
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 }
맵과 필터의 연계 사용
let numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8]
// 맵으로 값 변형 후 필터링
let mappedNumbers: [Int] = numbers.map { $0 + 3 }
let evenNumbers: [Int] = mappedNumbers.filter{ $0 % 2 == 0 }
// 맵과 필터 연결해서 사용
let oddNumbers: [Int] = numbers.map{ $0 + 3 }.filter{ $0 % 2 != 0 }
리듀스는 다음에 ..
'swift' 카테고리의 다른 글
[swift] sort와 sorted (0) | 2020.07.23 |
---|---|
[swift] String.Index와 String.SubSequence(Substring) (0) | 2020.07.21 |
[swift] 클로저 (closure) (0) | 2020.06.25 |
[swift] 값 타입 vs 참조 타입 (0) | 2020.06.22 |
[swift] 열거형 (enum) (0) | 2020.06.22 |