在swift中映射一个投掷函数——双击

在swift中映射一个投掷函数——双击,swift,error-handling,higher-order-functions,Swift,Error Handling,Higher Order Functions,一个很小的问题。当我尝试在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关键字似乎都是编译该

一个很小的问题。当我尝试在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关键字似乎都是编译该文件所必需的。但我觉得这是大错特错了——有没有一种方法可以不用第二次尝试就完成这种操作

从技术上讲,如果避免调用
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")
}
但我认为这是错误的方向。我只想采用这两种模式,即重新调用
map
等函数

我会丢失
字符串
,不过:

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

contentsOfFile
可以抛出。因此需要尝试一下。你没有抓住机会。因此,它渗透了。所以现在
map
可以抛出。因此需要尝试一下。否则,如果一个
contentsOfFile
失败会发生什么?如果您查看map的声明,您会发现这是写在中的:它所使用的函数可以完全一致地抛出,因为map会重新抛出。谢谢。我想我只需要重新校准我对代码气味的感觉:-)