일본 갈대 with Combine

16108 단어 CombineSwiftiOS

TL; DR

  • 3년 전 유행했던 트위터와 RxSwift 사용 기사가 떠올라 콤비로 재현해봤다
  • 나는 콤비로 조도코 갈대를 재현했는데... -mshrwtnb (@mshrwtnb_) October 25, 2019
    • 원소재는 여기 있다


    0. 대상 확인


    • “すん”“どこ”“き・よ・し!”출력은 모두receiveValue에서 수신합니다String. (=assign을 원하면 할 수 있는 상태를 목표로 합니다.)보도에서 input:○○○○○○로 표현하다.
    • Publisher의 print(_:to:) 디버깅에 사용됨(대답으로 계산되지 않음)
    • 한번에 "자 요 해요!"출력 후 처리 종료

    1. 강을 이루는 수원


    먼저'초밥'이나'어디'가 솟아오르는 수원을 만든다.

    잘 나오길 바라니까 0.1초 간격으로 한 번씩 출력해주세요.p>
    iOS13에서 추가된 사용Timer.publish(every:tolerance:on:in:options:)p>
        let ずんどこ水源 =
            Timer.publish(every: 0.1, on: .main, in: .default)
                .autoconnect()
                .map { _ in Int.random(in:0..<2) == 0 ? "ずん" : "どこ" }
                .share()
    
        self.cancellable =
            ずんどこ水源
            .sink(receiveCompletion: { _ in
                print("===完===")
            }, receiveValue: {
                print("input: \($0)")
            })
    

    결과는 여기 있습니다.


    좋아.아주 좋아요.기세 있는 용출량p>

    2. 센서가 달린 수문 건설


    위에서 말한 바와 같이, 수원에서 한 단어 한 단어가 흘러나오다p>

    '응, 응, 응, 응, 어디'의 5가지 요소를 검출하고 싶어서 FIFO 방식으로 5개만 저장된 연못을 만든다.

    그리고 축적된 요소가 목표의 패턴임을 판단하는 센서를 제작한다.

    모드가 감지되면 수문을 닫습니다.

    장난 없이 어디로 도망가다p>

        let センサー付き水門 =
            ずんどこ水源
                .scan([], { (reservoir: [String], element: String) -> [String] in
                    // 溜池
                    var newReservoir = Array(reservoir + [element])
                    if newReservoir.count > 5 {
                        newReservoir.removeFirst()
                    }
                    return newReservoir.prefix(5).map { $0 }
                })
                .allSatisfy { $0 != ["ずん", "ずん", "ずん", "ずん", "どこ"] }
                .map { _ in  }
                .share()
    

    3. 검사 후 "き・き・き!"통지


    ()의 흐르는 구조를 활용하여 <き・き・き・ノ!흐르는 스피커 만들기p>

       let スピーカー = センサー付き水門.map { _ in "き・よ・し!" }
    

    그래도 나쁘지 않아요.p>
    하지만 사치스러우면 "어디"와 "어디!"사이에서 "위하여"를 원합니다.

    거기서 1초 정도의'위하여'를 만들어라.

    결과에 영향을 미치지 않는 형식으로 원인 확인p>
        let スピーカー = センサー付き水門.map { _ in "き・よ・し!" }
                                    .handleEvents(receiveOutput: { _ in
                                        print("(せーの...!)")
                                    })
                                    .delay(for: .seconds(1.0), scheduler: RunLoop.main)
    

    4. 정비된 어느 강의 전모


    야천 상태, 곳곳에 필요한 설비가 있다.

    그리고 이것들을 잘 조합하세요.

    이렇게 하면 하천 관리도 매우 좋다p>
    let ずんどこ水源 =
        Timer.publish(every: 0.1, on: .main, in: .default)
            .autoconnect()
            .map { _ in Int.random(in:0..<2) == 0 ? "ずん" : "どこ" }
            .share()
    
    let センサー付き水門 =
        ずんどこ水源
            .scan([], { (reservoir: [String], element: String) -> [String] in
                // 溜池
                var newReservoir = Array(reservoir + [element])
                if newReservoir.count > 5 {
                    newReservoir.removeFirst()
                }
                return newReservoir.prefix(5).map { $0 }
            })
            .allSatisfy { $0 != ["ずん", "ずん", "ずん", "ずん", "どこ"] }
            .map { _ in  }
            .share()
    
    let スピーカー = センサー付き水門.map { _ in "き・よ・し!" }
                                .handleEvents(receiveOutput: { _ in
                                    print("(せーの...!)")
                                })
                                .delay(for: .seconds(1.0), scheduler: RunLoop.main)
    
    self.cancellable =
        ずんどこ水源
        .prefix(untilOutputFrom: センサー付き水門) // センサーが検知するまで、ずんどこを流す
        .merge(with: スピーカー) // 検知したら、き・よ・し!を流す
        .sink(receiveCompletion: { _ in
            print("===完===")
        }, receiveValue: {
            print("input: \($0)")
        })
    

    자, 마지막으로 이걸 움직여봅시다.

    ...


    ....


    .....



    💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪


    후기


    농담인 것 같은데, 한번 시도하면 조작원의 행동에 대해 상세해진다

    만약 더 좋은 실시례가 있다면 @mshrwtnb 전에 나에게 알려줄 수 있다면 나는 배울 것이다
    https://github.com/mshrwtnb/zundoko-combine 소스를 넣었어요.p>
    이상

    좋은 웹페이지 즐겨찾기