분류 전체보기
RxSwift(23). concatMap, scan, buffer, Window, groupBy
concatMap concatMap은 flatMap과 비교하면 쉽게 이해된다. let redCircle = "🔴" let greenCircle = "🟢" let blueCircle = "🔵" let redHeart = "❤️" let greenHeart = "💚" let blueHeart = "💙" Observable.from([redCircle, greenCircle, blueCircle]) .flatMap { circle -> Observable in switch circle { case redCircle: return Observable.repeatElement(redHeart) .take(5) case greenCircle: return Observable.repeatElement(greenHea..
프로그래머스 - 택배상자 Swift (스택, 구현)
https://school.programmers.co.kr/learn/courses/30/lessons/131704 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 및 소스코드 보조 컨베이어 벨트는 뒤에서만 뺄 수 있으므로 대놓고 스택문제다. 배열로 스택을 구현하고 아래의 설명처럼 구현하면 된다. import Foundation func solution(_ order:[Int]) -> Int { var target = 0 var stack = [Int]() var truck = [Int]() //상자는 1부터 order의 갯수만큼 들어온다. for n..
프로그래머스 - 가장 큰 정사각형 Swift(DP)
https://school.programmers.co.kr/learn/courses/30/lessons/12905?language=swift 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 및 소스코드 DP문제. 1, 1에서부터 비교를 시작해나간다. [x][y], [x-1][y], [x][y-1], [x-1][y-1] 중 가장 작은것에 1을 더해나간다. 이유는 한 번만 코드를 따라가봐도 알게됨.. 1, 1에서 시작하므로 [[1, 0], [0, 0]]의 경우 정답은 1인데 0이 출력될것이다. 그러므로 초기값은 board[0]의 max로 해두자. impo..
RxSwift(22). CreateOperators(just, of, from)(range, generate)(repeatElement)(deferred)(create)(empty, error)
(just, of, from) just just는 하나의 항목을 방출하는 옵저버블을 생성한다. 이 연산자는 옵저버블타입 프로토콜에 타입 메서드 로 선언되어있다. 파라미터로 하나의 요소를 받아서 옵저버블을 리턴한다. let element = "😀" Observable.just(element) 파라미터로 element(문자열)를 전달하면 이 문자열을 방출하는 옵저버블이 생성된다. let element = "😀" Observable.just(element) .subscribe{ event in print(event)} .disposed(by: disposeBag) //next(😀) //completed Observable.just([1, 2, 3]) .subscribe{ event in print(event)..
RxSwift(21). toArray, map, compactMap, flatMap, flatMapFirst, flatMapLatest
toArray 이 연산자는 옵저버블이 방출하는 모든 요소를 배열에 담은 다음 이 배열을 방출하는 옵저버블을 생성한다. 이 연산자는 별도의 파라미터를 받지 않는다. 하나의 요소를 방출하는 옵저버블로 변환하는데 더 정확히는 Single로 변환한다. Single는 하나의 요소를 방출하거나 ErrorEvent를 전달하는 특별한 옵저버블이다. 하나의 요소를 방출한 다음 바로 종료된다. let subject = PublishSubject() subject .toArray() .subscribe{ print($0) } .disposed(by: disposeBag) subject.onNext(1) 방출한 숫자가 구독자로 바로 전달되지 않는다. toArray는 소스 옵저버블이 방출하는 모든 요소를 하나의 배열에 담는다...
RxSwift(20). debounce, throttle
debounce, throttle는 짧은 시간동안 반복적으로 방출되는 이벤트를 제어한다는 공통점이 있다. 연산자로 전달하는 파라미터도 동일하다. 하지만 연산의 결과는 완벽히 다르기 때문에 잘 구분해서 사용해야한다. 공통 let buttonTap = Observable.create { observer in DispatchQueue.global().async { //0.3초 주기로 nextEvent를 10번 방출한다 for i in 1...10 { observer.onNext("Tap \(i)") Thread.sleep(forTimeInterval: 0.3) } //1초동안 중지하고 Thread.sleep(forTimeInterval: 1) //0.5초 주기로 10번 방출한다 for i in 11...20 ..
RxSwift(19).distinctUntilChanged
distinctUntilChanged 옵저버블에서 방출하는 이벤트를 순서대로 비교한 다음 이전 이벤트와 동일하다면 방출하지 않는다. 이벤트를 비교할 때에는 비교 연산자를 사용해서 포함되어있는 값을 비교한다. let numbers = [1, 1, 3, 2, 2, 3, 1, 5, 5, 7, 7, 7] Observable.from(numbers) .distinctUntilChanged() .subscribe{ print($0)} .disposed(by: disposeBag) //next(1) //next(3) //next(2) //next(3) //next(1) //next(5) //next(7) //completed 동일한 요소가 연속적으로 방출된게 아니라면 방출한다. 이전 이벤트와 다르다면 이미 방출했더라..
RxSwift(18). single
single연산자는 원본 옵저버블에서 첫 요소만 방출하거나 조건과 일치하는 첫 요소만 방출한다. 이름처럼 하나의 요소만 방출하고 두개이상의 요소가 방출될 때는 에러가 발생한다. let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.just(1) .single() .subscribe{print($0)} .disposed(by: disposeBag) Observable.from(numbers) .single() .subscribe{print($0)} .disposed(by: disposeBag) //next(1) //completed //next(1) //error(Sequence contains more than one element.) 하나의 요소를 방출할..
RxSwift(17). take, takeuntill, takewhile, takeLast, take(for:)
take연산자는 여러가지 버전이 있다. take take는 정수를 파라미터로 받아서 해당 숫자만큼만 이벤트를 방출한다. let disposeBag = DisposeBag() let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.from(numbers) .take(5) .subscribe{print($0)} .disposed(by: disposeBag) //next(1) //next(2) //next(3) //next(4) //next(5) //completed take로 전달된 5개만 방출한다 take연산자는 NextEvent이외엔 관여하지 않아서 마지막에 CompletedEvent || ErrorEvent를 전달한다. takeuntill takeuntil..
RxSwift(16). skip, skipWhile, skipUntil, skipduration
skip 연산자는 특정 요소를 무시하는 연산자이다. skip skip연산자는 정수를 파라미터로 받는다. 옵저버블이 방출하는 요소중에서 지정된 수만큼 무시한 다음에 이후에 방출되는 요소만 구독자로 전달한다. let disposeBag = DisposeBag() let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.from(numbers) .skip(3) .subscribe{ print($0)} //next(4) //next(5) //next(6) //next(7) //next(8) //next(9) //next(10) //completed 결과를 보면 4부터 방출된다. 지정한 3개의 요소 1, 2, 3을 무시하고 다음부터 방출한다. 코딩을 하다보면 skip연..