[Swift] 맵, 필터, 리듀스

김태형·2023년 4월 23일
0

Swift

목록 보기
22/22

오늘은 맵, 필터, 리듀스에 대해 알아볼 예정이다. ps를 풀 때 맵, 필터, 리듀스가 많이 사용됐었는데, 이 기회에 조금 더 잘 활용할 수 있었으면 좋겠다.


스위프트는 함수를 일급 객체로 취급 → 함수를 다른 함수의 전달인자로 사용가능

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

대표적인 고차함수로는 맵, 필터, 리듀스 등이 있음


  • 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수
  • 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 다시 컨테이너에 포장하여 반환함
  • 기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환됨
    • 스위프트는 타입에 엄격하기 때문에 타입을 변경하는데 유용하게 사용됨
  • 기존 데이터를 변형하는 데 많이 사용
  • for in 구문과 별 차이가 없음
    • 하지만 코드의 재사용 측면이나 컴파일러 최적화 측면에서 성능 차이 존재
    • 다중 스레드 환경일 때 발생하는 부작용 방지
let numbers: [Int] = [0, 1, 2, 3, 4]

var doubleNumbers: [Int] = [Int]()
var strings: [String] = [String]()

//for in 사용
for number in numbers {
    doubleNumbers.append(number * 2)
    strings.append("\(number)")
}

//map 사용
doubleNumbers = numbers.map({ (number: Int) -> Int in
    return number * 2
})
strings = numbers.map( { (number: Int) -> String in
    return "\(number)"
})

클로저를 통해 더욱 간결하게 사용 가능

//클로저 사용
doubleNumbers = numbers.map({ return $0 * 2 })

필터

  • 컨테이너 내부의 값을 걸러서 추출
  • map과 마찬가지로 새로운 컨테이너에 값을 담아 반환
  • 특정 조건에 맞게 걸러내는 역할을 함
  • 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool
    • 컨테이너에 포함될 항목은 true, 아니면 false를 반환함
let numbers: [Int] = [0, 1, 2, 3, 4, 5]

let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in
    return number % 2 == 0
}   //[0, 2, 4]

리듀스

  • 컨테이너 내부의 컨텐츠를 하나로 합하는 기능을 실행
let numbers: [Int] = [1, 2, 3]

var sum: Int = numbers.reduce(0, { (result: Int, next: Int) -> Int in
    print("\(result) + \(next)")
    return result + next
})

// 0 + 1
// 1 + 2
// 3 + 3

print(sum)  // 6

맵, 필터, 리듀스의 활용

//서울 외의 지역에 거주하며 25세 이상인 친구
var result: [Friend] = friends.map { Friend(name: $0.name, gender: $0.gender, location: $0.location, age: $0.age + 1)}

result = result.filter { $0.location != "서울" && $0.age >= 25 }

let string: String = result.reduce("서울 외의 지역에 거주하며 25세 이상인 친구") { $0 + "\n" + "\($1.name) \($1.gender) \($1.location) \($1.age)세"}
  • 맵으로 한 살씩 더한 후, 필터로 서울 이외의 거주하며 25세 이상인 사람으로 구성한 후 리듀스로 원하는 모양으로 출력함


맵, 필터, 리듀스 같은 경우에는 처음에도 언급했다싶이 ps에서 자주 활용되기 때문에 많이 사용해보기 !

0개의 댓글