[swift] 옵셔널 타입의 고차 함수 사용하기

고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다. 스위프트는 고차 함수를 통해 쉽게 컬렉션을 처리할 수 있는 기능을 제공합니다. 하지만 옵셔널 타입과 고차 함수를 함께 사용할 때 몇 가지 주의할 점이 있습니다.

옵셔널 타입은 값이 있을 수도 있고 없을 수도 있는 타입을 나타내며, 옵셔널 타입의 값은 nil일 수도 있습니다. 고차 함수를 사용할 때 옵셔널 타입의 값을 처리하는 방법에 유의해야 합니다.

1. 맵 함수

맵 함수는 컬렉션의 각 요소에 대해 주어진 함수를 적용하여 새로운 컬렉션을 생성합니다. 만약 맵 함수를 통해 옵셔널 타입의 컬렉션을 처리하고자 한다면, 값이 없는 옵셔널에 대해서는 적용되지 않고 그대로 옵셔널을 반환합니다.

let optionalNumbers: [Int?] = [1, 2, nil, 4, 5, nil]
let squaredNumbers = optionalNumbers.map { $0.map { $0 * $0 } }
print(squaredNumbers) // [Optional(1), Optional(4), nil, Optional(16), Optional(25), nil]

위의 예제에서는 숫자를 제곱하는 맵 함수를 사용하여 optionalNumbers 컬렉션의 각 요소를 제곱한 새로운 컬렉션을 생성합니다. 하지만 optionalNumbers 컬렉션에는 nil 값이 포함되어 있기 때문에 옵셔널 타입의 값으로 처리됩니다.

2. 플랫맵 함수

플랫맵 함수는 맵 함수와 비슷하지만, 맵 함수가 각 요소를 새로운 컬렉션으로 매핑한 후 결과를 묶어서 반환하는 반면, 플랫맵 함수는 각 요소를 새로운 컬렉션으로 매핑한 후 모든 결과를 하나의 컬렉션으로 펼쳐서 반환합니다. 이 때, 값이 없는 옵셔널은 무시됩니다.

let optionalNumbers: [Int?] = [1, 2, nil, 4, 5, nil]
let squaredNumbers = optionalNumbers.flatMap { $0.map { $0 * $0 } }
print(squaredNumbers) // [1, 4, 16, 25]

위의 예제에서는 맵 함수 대신 플랫맵 함수를 사용하여 optionalNumbers 컬렉션의 각 요소를 제곱한 뒤 하나의 배열로 펼칩니다. 이 때, 값이 없는 옵셔널은 자동으로 무시되어 최종 결과에 포함되지 않습니다.

3. 필터 함수

필터 함수는 주어진 조건에 맞는 요소로만 이루어진 새로운 컬렉션을 생성합니다. 만약 필터 함수를 통해 옵셔널 타입의 컬렉션을 처리하고자 한다면, 값이 없는 옵셔널에 대해서는 조건을 평가하지 않고 제외됩니다.

let optionalNumbers: [Int?] = [1, 2, nil, 4, 5, nil]
let evenNumbers = optionalNumbers.filter { $0?.isMultiple(of: 2) ?? false }
print(evenNumbers) // [Optional(2), nil, 4, nil]

위의 예제에서는 필터 함수를 사용하여 optionalNumbers 컬렉션에서 짝수인 요소만을 추려내는 작업을 수행합니다. 이 때, 값이 없는 옵셔널은 조건을 평가하지 않고 제외되며, 최종 결과에도 포함되지 않습니다.


고차 함수를 사용할 때 옵셔널 타입의 값에 주의하여 적절하게 처리해야 합니다. 맵, 플랫맵, 필터 함수를 통해 옵셔널 타입의 컬렉션을 처리할 때 값이 없는 옵셔널에 대한 처리를 명확하게 해야 합니다.