Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'”

Posted

技术标签:

【中文标题】Swift 编译器错误:“无法使用 \'((_) -> _)\' 类型的参数列表调用 \'map\'”【英文标题】:Swift compiler error: “Cannot invoke 'map' with an argument list of type '((_) -> _)'”Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'” 【发布时间】:2015-04-29 20:01:35 【问题描述】:

我有一个要映射的范围,但出现错误

“Cannot invoke 'map' with an argument list of type '((_) -> _)'”

代码如下所示

    let patterns = (0...5).map  verseNum in
        let verseNumberStartPattern = "\"verse-num\">\(verseNum)</span>(?:\\s?<span>)?(.*?)<"
        let chapterStartPattern = "\"chapter-num\">\\s\(parsedVerse.chapterStart)\\s</span>"
        if verseNum == 1 
            return chapterStartPattern + "(.*?)<"
         else 
            return chapterStartPattern + "(?:.*?)" + verseNumberStartPattern
        
    

如果我取出闭包内的所有内容并返回“”,那么编译器不会抱怨。但是,即使我在返回空字符串之外添加了一行,编译器也会报错,比如for:

    let patterns = (0...5).map  verseNum in
        let verseNumberStartPattern = "\"verse-num\">\(verseNum)</span>(?:\\s?<span>)?(.*?)<"
        return ""
    

我错过了什么吗?

【问题讨论】:

【参考方案1】:

Swift 不能每次都从上下文推断类型。如果它无法推断类型,则必须显式键入它们,在本例中为返回类型:

let patterns = (0...5).map  verseNum -> String in

在这种情况下,我相信 Swift 应该能够推断出类型,所以它可能是一个错误。

【讨论】:

我要补充一点,这确实是 Swift 类型推断中的一个错误,而不是它必须的方式。 verseNum 应该可以从范围中推断出来,并且可以从 return 语句中推断出返回值。 此外,如果您有子类,则需要使用基类类型名称,然后再次请求对象“as!”你的子类。 以下代码发生在我身上,仍然困惑Swift在使用格式时无法推断String构造函数的类型。不工作代码:(0...23).map String(format: "%02d", $0) 工作代码:(0...23).map hour -&gt; String in String(format: "%02d", hour)

以上是关于Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'”的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8.2,Swift 编译器错误:错误:意外的输入文件

Swift 编译器错误命令因信号而失败:分段错误:11

Pod 安装错误后,Swift 3 结果出现编译错误

安装 Xcode10.2.1 但仍然收到错误“使用 Swift 5.0.1 编译的模块无法由 Swift 5.1 编译器导入”

Swift 编译器错误,由于信号导致命令失败:分段错误:11

swift编译器显示预期的声明错误? [复制]