当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Optional.Publisher tryMap(_:)用法及代码示例


实例方法

tryMap(_:)

使用提供的 error-throwing 闭包转换来自上游发布者的所有元素。

声明

func tryMap<T>(_ transform: @escaping (Self.Output) throws -> T) -> Publishers.TryMap<Self, T>

返回值

发布者使用提供的闭包将元素从上游发布者映射到然后发布的新元素。

参数

transform

将一个元素作为其参数并返回一个新元素的闭包。如果闭包抛出错误,则发布者将失败并抛出错误。

详述

Combine 的 Publisher/tryMap(_:) 操作符执行的函数类似于 Swift 标准库中的 map(_:) :它使用闭包来转换从上游发布者接收到的每个元素。您可以使用 Publisher/tryMap(_:) 从一种元素转换为另一种元素,并在Map的关闭引发错误时终止发布。

以下示例使用数字数组作为基于集合的发布者的源。 Publisher/tryMap(_:) 运算符使用来自发布者的每个整数,并使用字典将其从阿拉伯数字转换为罗马等价数字,如 String 。如果 Publisher/tryMap(_:) 的闭包无法查找罗马数字,则会引发错误。 Publisher/tryMap(_:) 运算符捕获此错误并终止发布,发送包装错误的 Subscribers/Completion/failure(_:)


struct ParseError: Error {}
func romanNumeral(from:Int) throws -> String {
    let romanNumeralDict: [Int : String] =
        [1:"I", 2:"II", 3:"III", 4:"IV", 5:"V"]
    guard let numeral = romanNumeralDict[from] else {
        throw ParseError()
    }
    return numeral
}
let numbers = [5, 4, 3, 2, 1, 0]
cancellable = numbers.publisher
    .tryMap { try romanNumeral(from: $0) }
    .sink(
        receiveCompletion: { print ("completion: \($0)") },
        receiveValue: { print ("\($0)", terminator: " ") }
     )


// Prints: "V IV III II I completion: failure(ParseError())"

如果您的闭包没有抛出,请改用Publisher/map(_:)-99evh

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional.Publisher tryMap(_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。