【问题标题】:Mapping a throwing function in swift---double try快速映射投掷函数---双试
【发布时间】:2020-04-08 03:18:03
【问题描述】:

一个很小的问题。当我尝试在 Swift 中映射一个抛出函数时,编译器让我使用 try 关键字两次。举个玩具例子:

public func combineFiles(files: [String]) throws -> String {
    let strings = try files.map { try String(contentsOfFile: $0) }
    return strings.joined(separator: "\n\n")
}

为了编译它,第二行中的两个 try 关键字似乎都是必需的。但这对我来说感觉非常错误——有没有办法在没有第二次尝试语句的情况下进行这种操作?

【问题讨论】:

  • contentsOfFile 可以扔。因此需要一试。你没有赶上尝试。因此它渗透了。所以现在map 可以扔了。因此需要一试。否则如果一个contentsOfFile 失败会怎样?
  • 如果你看一下 map 的声明,你会发现它是这样写的:developer.apple.com/documentation/swift/array/3017522-map 它所接受的函数可以连贯地抛出,因为 map 重新抛出。

标签: swift error-handling higher-order-functions


【解决方案1】:

从技术上讲,如果您避免调用 map,您可以有一个 try

func combineFiles(files: [String]) throws -> String {
    var results: [String] = []
    for file in files {
        results.append(try String(contentsOfFile: file))
    }
    return results.joined(separator: "\n\n")
}

但我认为这是错误的方向。我会接受两个 try 模式,它需要像 map 这样的重新抛出函数。

我会失去strings,但是:

func combineFiles(files: [String]) throws -> String {
    try files.map { try String(contentsOfFile: $0) }
        .joined(separator: "\n\n")
}

【讨论】:

  • 谢谢。我想我只需要重新调整我对代码气味的感觉 :-)
猜你喜欢
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多