본문 바로가기
Swift

Swift Combine에서 다양한 Sequence 연산자 활용하기

by mr.conan 2023. 6. 20.
728x90
반응형

Swift Combine은 데이터 흐름을 처리하고 변환하기 위한 다양한 Sequence 연산자를 제공합니다. 이번 글에서는 Prepend, firstWhere, tryFirstWhere, first, lastWhere, tryLastWhere, last, dropWhile, prefix, prefix(while: {}), prefix(untilOutputFrom:) 연산자에 대해 개념과 사용 예제를 알아보겠습니다.

 

 

Prepend 연산자 Prepend 연산자는 Publisher 앞에 값을 추가하여 새로운 Publisher를 생성합니다. 추가된 값은 기존 Publisher의 첫 번째 값이 되며, 그 후에 기존 Publisher가 방출하는 값들이 이어집니다.

import Combine

let numbers = (1...3).publisher

numbers
    .prepend(0)
    .sink { value in
        print("Value: \(value)")
    }

위의 예제에서는 1부터 3까지의 숫자를 방출하는 Publisher를 생성하고, prepend 연산자를 사용하여 0을 추가합니다. 이후, 새로운 Publisher를 구독하여 값을 출력합니다. 결과는 0부터 시작하여 1, 2, 3 순서로 출력됩니다.

 

 

firstWhere 연산자 firstWhere 연산자는 주어진 조건을 만족하는 첫 번째 값만을 방출하는 Publisher를 생성합니다.

 

import Combine

let numbers = (1...5).publisher

numbers
    .firstWhere { $0 % 2 == 0 }
    .sink { value in
        print("First even number: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, firstWhere 연산자를 사용하여 첫 번째로 짝수인 값을 방출합니다. 이후, 해당 값을 출력합니다.

 

 

tryFirstWhere 연산자 tryFirstWhere 연산자는 firstWhere 연산자와 유사한 역할을 수행하지만, 에러 처리를 지원합니다. 조건을 만족하는 첫 번째 값을 방출하고, 조건을 만족하지 않거나 에러가 발생하면 에러를 방출합니다.

import Combine

enum MyError: Error {
    case example
}

let numbers = [1, 2, 3, 4, 5].publisher

numbers
    .tryFirstWhere { value in
        guard value != 3 else {
            throw MyError.example
        }
        return value % 2 == 0
    }
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Completed without errors.")
        case .failure(let error):
            print("Error occurred: \(error)")
        }
    }, receiveValue: { value in
        print("First even number: \(value)")
    })

위의 예제에서는 배열 [1, 2, 3, 4, 5]를 Publisher로 생성하고, tryFirstWhere 연산자를 사용하여 짝수인 값을 찾습니다. 그 중에서 값이 3인 경우 에러를 발생시킵니다. 이후, 에러 발생 여부에 따라 에러 처리 또는 정상적인 결과를 출력합니다.

 

 

first 연산자 first 연산자는 첫 번째 값을 방출하는 Publisher를 생성합니다.

import Combine

let numbers = (1...5).publisher

numbers
    .first()
    .sink { value in
        print("First value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, first 연산자를 사용하여 첫 번째 값을 방출합니다. 이후, 해당 값을 출력합니다.

 

 

lastWhere 연산자 lastWhere 연산자는 주어진 조건을 만족하는 마지막 값만을 방출하는 Publisher를 생성합니다.

import Combine

let numbers = (1...5).publisher

numbers
    .lastWhere { $0 % 2 == 0 }
    .sink { value in
        print("Last even number: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, lastWhere 연산자를 사용하여 마지막으로 짝수인 값을 방출합니다. 이후, 해당 값을 출력합니다.

 

tryLastWhere 연산자 tryLastWhere 연산자는 lastWhere 연산자와 유사한 역할을 수행하지만, 에러 처리를 지원합니다. 조건을 만족하는 마지막 값을 방출하고, 조건을 만족하지 않거나 에러가 발생하면 에러를 방출합니다.

import Combine

enum MyError: Error {
    case example
}

let numbers = [1, 2, 3, 4, 5].publisher

numbers
    .tryLastWhere { value in
        guard value != 3 else {
            throw MyError.example
        }
        return value % 2 == 0
    }
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Completed without errors.")
        case .failure(let error):
            print("Error occurred: \(error)")
        }
    }, receiveValue: { value in
        print("Last even number: \(value)")
    })

위의 예제에서는 배열 [1, 2, 3, 4, 5]를 Publisher로 생성하고, tryLastWhere 연산자를 사용하여 짝수인 값을 찾습니다. 그 중에서 값이 3인 경우 에러를 발생시킵니다. 이후, 에러 발생 여부에 따라 에러 처리 또는 정상적인 결과를 출력합니다.

 

last 연산자 last 연산자는 마지막 값을 방출하는 Publisher를 생성합니다.

import Combine

let numbers = (1...5).publisher

numbers
    .last()
    .sink { value in
        print("Last value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, last 연산자를 사용하여 마지막 값을 방출합니다. 이후, 해당 값을 출력합니다.

 

 

dropWhile 연산자 dropWhile 연산자는 주어진 조건을 만족하는 값들을 처음부터 무시하고, 조건을 만족하지 않는 값부터 방출하는 Publisher를 생성합니다.

import Combine

let numbers = (1...5).publisher

numbers
    .dropWhile { $0 < 3 }
    .sink { value in
        print("Value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, dropWhile 연산자를 사용하여 값이 3보다 작은 동안은 무시합니다. 이후, 조건을 만족하지 않는 값부터 방출되는 Publisher를 구독하여 값을 출력합니다.

 

 

prefix 연산자 prefix 연산자는 주어진 개수만큼의 값을 처음부터 방출하는 Publisher를 생성합니다.

import Combine

let numbers = (1...5).publisher

numbers
    .prefix(3)
    .sink { value in
        print("Value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, prefix 연산자를 사용하여 처음 세 개의 값을 방출하는 Publisher를 생성합니다. 이후, 해당 값을 출력합니다.

 

 

prefix(while: {}) 연산자 prefix(while: {}) 연산자는 주어진 조건을 만족하는 값들을 처음부터 방출하는 Publisher를 생성합니다. 조건을 만족하지 않는 값이 나올 때까지 방출됩니다.

import Combine

let numbers = (1...5).publisher

numbers
    .prefix(while: { $0 < 4 })
    .sink { value in
        print("Value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 Publisher를 생성하고, prefix(while: {}) 연산자를 사용하여 값이 4보다 작은 동안 방출하는 Publisher를 생성합니다. 이후, 해당 값을 출력합니다.

 

prefix(untilOutputFrom: ) 연산자 prefix(untilOutputFrom: ) 연산자는 주어진 Publisher가 값을 방출하기 전까지의 값들을 처음부터 방출하는 Publisher를 생성합니다.

import Combine

let prefixPublisher = (1...5).publisher
let suffixPublisher = (6...10).publisher

prefixPublisher
    .prefix(untilOutputFrom: suffixPublisher)
    .sink { value in
        print("Value: \(value)")
    }

위의 예제에서는 1부터 5까지의 숫자를 방출하는 첫 번째 Publisher와 6부터 10까지의 숫자를 방출하는 두 번째 Publisher를 생성합니다. prefix(untilOutputFrom: ) 연산자를 사용하여 두 번째 Publisher가 값을 방출하기 전까지 첫 번째 Publisher의 값을 방출합니다. 이후, 해당 값을 출력합니다.


이렇게 Swift Combine에서 제공하는 다양한 Sequence 연산자들을 활용하면 데이터 흐름을 효과적으로 제어하고 변환할 수 있습니다. 각 연산자의 개념과 사용 예제를 통해 원하는 동작을 구현해보세요. Happy Coding!

728x90
반응형