본문 바로가기

swift

[swift] 고차함수 - 맵 (Map), 필터(Filter)

고차함수 : 매개변수로 함수를 갖는 함수

 

맵 (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