Day18 Combine 05 - Operators 类型介绍 : 转换操作符

转换操作符

map/mapError

map操作符会执行给定的闭包,将上游发布的内容进行转换,然後再发送给下游订阅者,mapError则将错误转换为另外一种错误类型

[1, 2].publisher
    .map { $0.description + "test" }
    .sink(receiveValue: { value in
        print(value)
    })

flatMap

flatMap 操作符会转换上游发布者发送的所有的元素,然後返回一个新的或者已有的发布者。

flatMap 会将所有返回的发布者的输出合并到一个输出流中。我们可以通过 flatMap 操作符的 maxPublishers 参数指定返回的发布者的最大数量

class TestObservableObject: ObservableObject {
    var cancellable: AnyCancellable?
    
    struct Student: Decodable {
        let name: String
    }

    let json = """
    [{
    "name": "Ryder"
    },
    {
    "name": "Jason"
    },
    {
    "name": "Ray"
    }]
    """
    
    init() {
        let publisher = PassthroughSubject<String, Never>()
        
        cancellable = publisher
            .flatMap { value in
                Just(value.data(using: .utf8)!)
                    .decode(type: [Student].self, decoder: JSONDecoder())
                    .catch { _ in
                        Just([Student(name: "errorName")])
                    }
            }
            .sink(receiveCompletion: { _ in
                print("finished")
            }, receiveValue: { someValue in
                print(someValue)
            })
        
        publisher.send(json)
    }
}

因为flatMap闭包要求的返回值必须是一个publisher,所以在上边的程序码中,我们使用了Just,它把 json资料对映成阵列。

在上边的catch中也用到了Just,目的是当发生错误时,返回一个预设的值,值得注意的是,catch同样要求返回一个publsiher

scan

scan将收到的值与当前的值,按照给定的closure 进行转换

(1...3).publisher
    .scan(3, +)
    .sink(receiveValue: { value in
        print(value)
    })
/*印出 
4
6
9
*/

<<:  【学习笔记-CSS】background 各属性

>>:  30天学会 Python: Day 17-自动化的第一步

Day 26 战斗民族-俄罗斯酸奶牛肉 Beef Stroganoff

为了做火焰烤饼而自制酸奶油,做完烤饼还有剩下的酸奶油,所以试着找了其他酸奶油料了,意外发现了俄罗斯的...

[ JS个人笔记 ] 传值传址&深浅层拷贝—DAY5

传值(call by value)vs传址(call by reference) 基本型别(Numb...

伸缩自如的Flask [day5] session

假设,你今天写了一个页面或是储存了一些简单的状态或资讯,call了另外一个API或是跳转到不同页面并...

资安学习路上-渗透测试实务4

初始控制 会利用某些手段达成RCE(Remote code execution,远端代码执行),方法...

JavaScript Arrow Function(箭头函式)

箭头函式 箭头函式功能与一般函式的用法大致差不多,不过写法却比一般函式还要简洁的多。 这里就直接来时...