RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
next이벤트를 통해 받은 값들을 어떤 조건에 의해 filter 해야할수도 있다.
filter를 할 수 있는 연산자에 대해 정리해보겠다.
전체 코드는 깃허브 에서 확인가능하다.
elementAt은 정수형의 index를 파라미터로 받는다. argument label(전달인자 레이블)인 at을 통해 파라미터인 index의 역할을 추측할 수 있다.
그리고 return 값을 보면 Observable 이고, 그리고 이 Observable이 해당하는 하나의 요소를 방출하게 된다.
실행 코드를 보면서 elementAt의 특징을 살펴보겠다.
.element(at: 3)
에서 파라미터인 index는 특정 index에 해당하는 요소를 방출하게 된다.
let numArr : [Int] = [0,1,2,3,4,5]
Observable.from(numArr)
.element(at: 3)
.subscribe { print("elementAt : \($0)")}
.disposed(by: disposeBag)
index가 아닌 특정 조건에 따라 filter를 쓰고 싶을때는 filter 연산자를 사용할수 있다.
filter 연산자의 경우, 클로저를 파라미터로 받는다. bool을 return 하게 되는데 이때, true를 return 하게 될때의 요소가 Observable에 포함이 된다.
즉, 조건이 참일때의 이벤트를 방출하게 된다.
단순히, 숫자배열로 늘 예시로 드니 좀 지루해져서 다시 취미인 크로스핏을 예시로 들겠다.
약간의 TMI의 시간을 갖자면, 크로스핏에서는 역도, 체조 동작등을 합쳐 운동을 할수있다.
그래서 이번 filter연산자를 통해 체조 동작들을 뽑아내려고 한다.
우선, 동작의 분야를 정의하는 enum과 동작이름과 분야를 담을수 있는 struct를 아래와 같이 정의하였다.
enum Field {
case weightlifting, gymnastics, uncertain
}
struct Movement {
let name : String
let field : Field
}
그리고 동작을 추가해주었다.
var movements : [Movement] = []
movements.append(Movement(name: "handstand push up", field: .gymnastics))
movements.append(Movement(name: "toes to bar", field: .gymnastics))
movements.append(Movement(name: "power clean", field: .weightlifting))
movements.append(Movement(name: "hang squat snatch", field: .weightlifting))
movements.append(Movement(name: "box jump over", field: .uncertain))
이제 원하는 대로 filter 를 활용해 gymnastics 동작만 필터링을 해보았다.
// gymnastic 동작만 꺼내기
Observable.from(movements)
.filter { $0.field == .gymnastics }
.subscribe { print("🤸♀️gymnastics 동작은 \($0)") }
.disposed(by: disposeBag)
이 결과, next 이벤트로 체조 동작인 handstand push up 과 toes to bar 를 얻을 수 있다.