Day19 Combine 06 - Operators 类型介绍 : 过滤操作符

filter

filter 只会让满足条件的值通过,filter接受一个闭包作为引数,该闭包返回一个Bool型别的值,只有结果为true的资料才会被储存下来

[1, 6, 15, 22].publisher
    .filter { value in
        value > 10
    }
    .sink(receiveCompletion: { _ in
        print("finished")
    }, receiveValue: { value in
        print(value)
    })
/*印出 
15
22
finished
*/

compactMap

compactMapmap的功能类似,只是会自动过滤掉空的元素,它的引数中的闭包支援返回一个可选型别的引数,因此,我们可以把传进来的资料直接返回,就这麽简单的一个操作就实现了空值过滤

["1", nil, "2", nil, "3"].publisher
    .compactMap { value -> Int? in
        guard let v = value else {
            return nil
        }
        return Int(v)
    }
    .sink(receiveCompletion: { _ in
        print("finished")
    }, receiveValue: { value in
        print(value)
    })
/*印出 
1
2
3
finished
*/

removeDuplicates

removeDuplicates 过滤掉连续的重复值

[1, 1, 1, 2, 2, 1, 2, 3].publisher
    .removeDuplicates()
    .sink(receiveCompletion: { _ in
        print("finished")
    }, receiveValue: { value in
        print(value)
    })
/*印出 
1
2
1
2
3
finished
*/

replaceEmpty/replaceNil/replaceError

  • 如果上游Publisher 是个空的数据流,replaceEmpty会发送指定的值

    Empty<Int, Never>()
        .replaceEmpty(with: 1)
        .sink(receiveCompletion: { _ in
            print("finished")
        }, receiveValue: { value in
            print(value)
        })
    /*印出 
    1
    finished
    */
    

    空的数据流:在收到finish事件前,从来没有收到任何资料

    Empty:一个只发出完成事件的Publisher

  • 将收到的nil转换为给定的值

    [1, nil, 3].publisher
    		.replaceNil(with: -1)
    		.map { $0! }
    		.sink(receiveCompletion: { _ in
    				print("finished")
    		}, receiveValue: { value in
    				print(value)
     		})
    /*印出 
    1
    -1
    3
    finished
    */
    
  • 如果上游Publisher 因错误而终止,replaceError会发送指定的值

    enum MyError: Error {
      case failed
    }
    
    var subject = PassthroughSubject<Int, Error>()
    
    subject
      .replaceError(with: 0)
      .sink(receiveCompletion: { completion in
        print(completion)
      }, receiveValue: { int in
        print(int)
      })
    
    subject.send(1)
    subject.send(2)
    subject.send(completion: .failure(MyError.failed))
    

<<:  Day 19 : 笔记篇 06 — 结合资讯处理流程,让笔记的 Metadata 变得更详细

>>:  Day22 vue.js修改文章

[Day 28] 旅行趣事 - 葡萄园脚踏车之旅

本来去之前,想的是边骑边造访酒庄,然後喝得醉茫茫 骑着脚踏车晃来晃去的XDD 但实际上,是一场体力...

【Day-27】我们是怎麽开始的?:一间传统软件公司从 0 开始建置的 DevOps 文化(工具篇)- 头脑风暴

前言 昨天我们介绍了高品质工作四部法,今天让我们来介绍头脑风暴。 头脑风暴,是一种为激发创造力、强化...

最简单的 Google Maps 嵌入方式 | 专案实作

工具有许多种,不过随着专案大小与需求不同,搭配适合的实作方式才能达到最佳效益,常见的 Google ...

Day6 Python基础语法四

今天的影片内容为稍微困难的函式与类别 虽然有点小复杂,但弄清楚後对程序的编写将会有很大的帮助 以下为...

#4. Covid 19 Tracker(Vue版)

今天任务的实作内容,主要是参考这支影片 影片中使用的程序码风格是Vue的Option API,在我的...