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 -> String in String(format: "%02d", hour)
以上是关于Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'”的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 8.2,Swift 编译器错误:错误:意外的输入文件
安装 Xcode10.2.1 但仍然收到错误“使用 Swift 5.0.1 编译的模块无法由 Swift 5.1 编译器导入”