添加不相关的 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 ... }
游乐场
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 ... }