let numbers: [Int] = [1, 2, 3, 4, 5]
cancellable = numbers.publisher
.filter { $0 % 2 == 0 }
.sink { print("\\($0)", terminator: " ") }
// Prints: "2 4"
let numbers = (0...5)
let romanNumeralDict: [Int : String] =
[1: "I", 2: "II", 3: "III", 5: "V"]
cancellable = numbers.publisher
.compactMap { romanNumeralDict[$0] }
.sink { print("\\($0)", terminator: " ") }
// Prints: "I II III V"
let numbers = [0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0]
cancellable = numbers.publisher
.removeDuplicates()
.sink { print("\\($0)", terminator: " ") }
// Prints: "0 1 2 3 4 0"
// input, output이 equatable 준수할경우에 가능함.
//이전과 비교해 같으면 무시함.
equatable프르토콜을 체택하지 않은 객체의 중복을 검사하기위해 클로저를 직접 구현함.
struct Point {
let x: Int
let y: Int
}
let points = [Point(x: 0, y: 0), Point(x: 0, y: 1),
Point(x: 1, y: 1), Point(x: 2, y: 1)]
cancellable = points.publisher
.removeDuplicates { prev, current in
// Considers points to be duplicate if the x coordinate
// is equal, and ignores the y coordinate
prev.x == current.x
}
.sink { print("\\($0)", terminator: " ") }
// Prints: Point(x: 0, y: 0) Point(x: 1, y: 1) Point(x: 2, y: 1)
퍼블리셔가 아무런 엘리멘트도 방출하지 않을경우 작동함.
let numbers: [Double] = []
cancellable = numbers.publisher
.replaceEmpty(with: Double.nan)
.sink { print("\\($0)", terminator: " ") }
// Prints "(nan)".
let otherNumbers: [Double] = [1.0, 2.0, 3.0]
cancellable2 = otherNumbers.publisher
.replaceEmpty(with: Double.nan)
.sink { print("\\($0)", terminator: " ") }
// Prints: 1.0 2.0 3.0
에러를 일반적인 요소로 치환해줌.
struct MyError: Error {}
let fail = Fail<String, MyError>(error: MyError())
cancellable = fail
.replaceError(with: "(replacement element)")
.sink(
receiveCompletion: { print ("\\($0)") },
receiveValue: { print ("\\($0)", terminator: " ") }
)
// Prints: "(replacement element) finished".