添加不相关的 NOP 声明时 compactMap() 关闭失败?

compactMap() closure fails when adding irrelevant NOP declaration?

游乐场

XCode 版本 13.3 (13E113)

Swift 5.6


compactMap() 闭包的第一次打印显示如下:

["What\'s", "Going", "On?"]

第二次打印显示:

[(), (), ()]

似乎如果我在闭包内声明任何东西,闭包的输出就会改变。

print(  "What's\nGoing\nOn?".split(separator:"\n").enumerated().compactMap
{ idx, lineText in
    lineText
})

print(  "What's\nGoing\nOn?".split(separator:"\n").enumerated().compactMap
{ idx, lineText in
    let _ : String
    lineText
})

有没有办法包装其中的一些以隐藏其他声明?

闭包是不是混淆了类型?

有什么方法可以消除它(或我)的混淆吗?

它是 Swift 错误吗?

问题是我尝试使用此模式进行的其他操作无法正常工作的根源。

更新

根据下面@Shadowrun 的回答,我在第三个示例中添加了一个 return 语句,但这会导致编译时错误。那么可以解决吗?

print(  "What's\nGoing\nOn?".split(separator:"\n").enumerated().compactMap
{ idx, lineText in
    let _ : String
    return lineText
})

表达式解析失败: 错误:测试playground.playground:38:52:错误:无法推断通用参数'ElementOfResult' print( "What's\nGoing\nOn?".split(separator:"\n").enumerated().compactMap

                                       ^
Swift.Sequence:2:28: note: in call to function 'compactMap'
    @inlinable public func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]</b>

如果您有单行闭包,则存在隐含的 return,因此第一个是 returning lineText,它是字符串类型。请参阅 https://docs.swift.org/swift-book/LanguageGuide/Functions.html

中的“具有隐式 Return 的函数”

第二个实际上return什么都没有,一旦超过一行,就没有隐含的return。所以 return 类型是 Void ,它也被拼写为空元组,() 这就是你得到的结果。

如果你想 return 某事,你需要明确地说 return lineText

这个函数:

{ idx, lineText in
    let _ : String
    lineText  // This line evaluates the value of lineText and does nothing with the result
}

没有 return 值。任何没有 return 值 return 的函数都是 Void 值。 void 是一种只有一个可能值的类型,称为 ()。映射到 void 是毫无意义的事情。即使你的函数有副作用,比如打印一些东西,仅仅为了副作用而使用 map 也不是好的风格。

您可以通过更明确地说明闭包中的 return 类型来防止此类错误

{ idx, lineText -> String in ... }