Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- combine
- Human interface guide
- collectionview
- UICollectionView
- Protocol
- 애니메이션
- Clean Code
- UITextView
- map
- 리팩토링
- 리펙터링
- MVVM
- ios
- clean architecture
- uiscrollview
- swiftUI
- tableView
- Observable
- HIG
- 클린 코드
- Xcode
- 리펙토링
- SWIFT
- RxCocoa
- Refactoring
- rxswift
- ribs
- 스위프트
- swift documentation
- uitableview
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] Combine Reducing 연산자 (collect, ignoreOutput, reduce, tryReduce) 본문
iOS Combine (SwiftUI)
[iOS - SwiftUI] Combine Reducing 연산자 (collect, ignoreOutput, reduce, tryReduce)
jake-kim 2022. 11. 9. 23:30목차) Combine - 목차 링크
Reduce
- 배열과 같은 Sequence형태를 하나의 값이나 축소 시키는 연산자
- collect 연산자
- collect(n)이면 n 만큼 묶어서 방출
(0...10).publisher
.collect(5)
.sink { print($0) }
/*
[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10]
*/
- ignoreOutput()
- 값이 방출되는 값은 모두 무시하고 completion의 failure만 방출
struct NoZeroValuesAllowedError: Error {}
let numbers = [1, 2, 3, 4, 5, 0, 6, 7, 8, 9]
numbers.publisher
.tryFilter({ anInt in
guard anInt != 0 else { throw NoZeroValuesAllowedError() }
return anInt < 20
})
.ignoreOutput()
.sink(
receiveCompletion: { print("completion: \($0)") },
receiveValue: { print("value \($0)") }
)
// completion: failure(.NoZeroValuesAllowedError())
- reduce(_:_:)
- 첫번째 인수에는 초기값을 넣고, 두번째에는 연산 ($0, $1) 결과를 리턴
- $0는 누적값, $1는 배열을 순회하는 값
print("-------")
[1,2,3,4].publisher
.reduce(0, { $0 + $1 })
.sink { print($0) }
// 10
- tryReduce(_:)
- 위 reduce의 기능을하면서 동시에 예외를 던지고 싶은 경우 throw로 예외 던지기가 가능
- 처리는 catch 연산자 사용
struct DivisionByZero: Error {}
[1,2,3,4,0].publisher
.tryReduce(0, {
guard $1 != 0 else { throw DivisionByZero() }
return $0 / $1
})
.catch { _ in Just(-1) }
.sink { print($0) }
// -1
'iOS Combine (SwiftUI)' 카테고리의 다른 글
Comments