Filtering Operators

이세진·2022년 9월 20일
0

iOS

목록 보기
40/46

filter


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

numbers.filter { $0 % 2 == 0 }
    .sink {
        print($0)
}
// 출력값
2
4
6
8
10

말 그래도 값을 필터링 해주는 Operator

removeDuplicates


let words = "apple apple apple fruit apple mango watermelon apple".components(separatedBy: " ").publisher

words
    .removeDuplicates()
    .sink {
    print($0)
}

// 출력값
apple
fruit
apple
mango
watermelon
apple

removeDuplicates는 말 그대로 중복을 제거해준다.

주의할 점은 모든 중복 값을 제거하는 것이 아니라 연속되는 중복 값만 제거해 준다는 점이다.

compactMap


let strings = ["a", "b", "1.24", "b", "3.14", "c"].publisher

strings.compactMap {
    Float($0)
}.sink {
    print($0)
}

// 출력값
1.24
3.14

compactMap은 nil을 제거해준다.

ignoreOutput


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

numbers.ignoreOutput().sink(receiveCompletion: { print($0) }, receiveValue: { print($0) })

// 출력값
finished

원래는 1부터 5000까지의 수가 출력되어야 하지만 ignoreOutput()을 넣게 되면 모든 output이 무시되어 completion에서 finished만 출력된다.

first


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

numbers.first(where: { $0 % 2 == 0 })
    .sink {
        print($0)
}

// 출력값
2

where의 조건에 해당하는 첫 번째 output만 전달한다.

last


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

numbers.last(where: { $0 % 2 == 0 })
    .sink {
        print($0)
}

// 출력값
8

where의 조건에 해당하는 마지막 output만 전달한다.

dropFirst


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

numbers.dropFirst(5).sink {
    print($0)
}

// 출력값
6
7
8
9
10

dropFirst(_ count:Int) 를 사용하여 count 만큼의 최초 output을 무시할 수 있다.

dropWhile


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

numbers.drop(while: { $0 % 3 != 0 })
    .sink {
        print($0)
}

// 출력값
3
4
5
6
7
8
9
10

drop(while: ) 을 사용하여 while 조건을 만족하기 전까지의 output을 무시할 수 있다.

drop(untilOutputFrom)


let isReady = PassthroughSubject<Void, Never>()
let taps = PassthroughSubject<Int, Never>()

taps.drop(untilOutputFrom: isReady).sink {
    print($0)
}

(1...10).forEach {
    taps.send($0)
    
    if $0 == 3 {
        isReady.send()
    }
}

// 출력값
4
5
6
7
8
9
10

drop(untilOutputFrom: publisher)를 사용하여 untilOutputFrom에 들어갈 publisher가 output을 발생시키기 전까지 본인의 output을 무시할 수 있다.

filter


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

numbers.prefix(3).sink {
    print($0)
}

// 출력
1
2
3

prefix() 를 사용하여 최초 몇회까지의 output을 사용할 것인지 지정할 수 있다.

numbers.prefix(while: { $0 < 3 }).sink {
    print($0)
}

prefix(while: )을 사용하여 다양하게 활용가능하다.

profile
나중은 결코 오지 않는다.

0개의 댓글