Swift

Swift | 고차함수 - filter, reduce

iOSDEv 2024. 2. 7. 14:51
filter

특정 조건을 만족하는 요소들만을 걸러내는 함수

새로운 컬렉셔능ㄹ 반환하고 원본 컬렉션의 요소 중 조건을 만족하는 요소들로 이루어진 배열을 생성

 

기본 형식
let filteredArray = array.filter { (element) -> Bool in
    // 조건 로직
    // true를 반환하면 해당 요소를 포함, false를 반환하면 제외
}

 

예시
let cast: Set = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }


shortNames.isSubset(of: cast)
// true
shortNames.contains("Vivien")
// false

 

let numbers = [5, 10, 15, 20, 25, 30]
let filteredNumbers = numbers.filter { $0 > 10 }

print(filteredNumbers) // 출력: [15, 20, 25, 30]

 

 

reduce

컬렉션의 모든 요소를 결합하여 단일 값으로 만드는 함수 초기값과 클로저를 사용해서 각 요소를 결합하는 방식

 

기본 형식
let result = array.reduce(initialResult) { (partialResult, element) -> T in
    // 결합 로직
}

 

예시

 

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
    x + y
})
// numberSum == 10



let letters = "abracadabra"
let letterCount = letters.reduce(into: [:]) { counts, letter in
    counts[letter, default: 0] += 1
}
// letterCount == ["a": 5, "b": 2, "r": 2, "c": 1, "d": 1]


let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { (partialResult, element) in
    return partialResult + element
}

print(sum) // 출력: 15

 

 

복합 예시
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let result = numbers.filter { $0 % 2 != 0 }.map { $0 * $0 }.filter { $0 > 10 }.reduce(0) { $0 + $1 }

print(result) // 출력: 74

 

 

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

//각 요소 홀수를 거르고 홀수를 제곱한 값이 10보다 크다면 누적된 값을 업데이트함 
let result = numbers.reduce(0) { (accumulator, element) in
    guard element % 2 != 0 else { return accumulator }
    
    let squared = element * element
    return squared > 10 ? accumulator + squared : accumulator
}

print(result) // 출력: 115

 

 

let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

// 예시 1: 각 행의 합을 구하기
let rowSums = matrix.map { row in
    row.reduce(0, +)
}
print("행 합계:", rowSums) // 출력: [6, 15, 24]

// 예시 2: 모든 요소의 제곱 값들 중에서 20 이상인 값만 추출하기
let filteredSquaredValues = matrix.flatMap { $0.map { $0 * $0 } }.filter { $0 >= 20 }
print("20 이상인 제곱 값들:", filteredSquaredValues) // 출력: [25, 36, 49]

// 예시 3: 각 열의 합을 구하기
let columnSums = (0..<matrix[0].count).map { columnIndex in
    matrix.reduce(0) { $0 + $1[columnIndex] }
}
print("열 합계:", columnSums) // 출력: [12, 15, 18]



//문자열 배열에서 각 문자열의 길이가 홀수인 경우를 걸러내고, 그 길이들의 제곱의 합 구하기
let words = ["apple", "banana", "orange", "grape"]
let result = words.filter { $0.count % 2 != 0 }.map { $0.count * $0.count }.reduce(0) { $0 + $1 }

print(result) // 출력: 65

//중첩된 배열에서 짝수만 걸러내고, 각 짝수를 제곱한 값 중 20보다 작은 값들만 추출하여 더하기
let nestedNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let result = nestedNumbers.flatMap { $0.filter { $0 % 2 == 0 }.map { $0 * $0 } }.filter { $0 < 20 }.reduce(0) { $0 + $1 }

print(result) // 출력: 84


//옵셔널 정수 배열에서 nil이 아닌 값들 중 3으로 나누어 떨어지는 값들의 제곱의 합 구하기
let optionalNumbers: [Int?] = [1, 2, nil, 4, 5, 6, nil, 8, 9]
let result = optionalNumbers.compactMap { $0 }.filter { $0 % 3 == 0 }.map { $0 * $0 }.reduce(0) { $0 + $1 }

print(result) // 출력: 90