Swift 以最简单的形式在map()中应用键路径

Swift 以最简单的形式在map()中应用键路径,swift,swift5,swift-keypath,Swift,Swift5,Swift Keypath,错误: 表达式类型不明确,没有更多上下文 为什么不起作用?似乎应该如此。 如果不是这样的话,我们怎么才能摆脱这里丑陋的{$0} 也许一个使用compactMap的例子会让您更满意 错误: 无法将“WritableKeyPath”类型的值转换为预期值 参数类型“(Int?)抛出->ElementOfResult?” 为什么不起作用?似乎应该这样 你说得对。两个示例都应该编译,因为 已在Swift 5中实施,并且 已在Swift 5.2中实施 事实上,后一个建议明确提到了一个类似于你的例子。但是

错误:

表达式类型不明确,没有更多上下文

为什么不起作用?似乎应该如此。
如果不是这样的话,我们怎么才能摆脱这里丑陋的{$0}

也许一个使用compactMap的例子会让您更满意

错误:

无法将“WritableKeyPath”类型的值转换为预期值 参数类型“(Int?)抛出->ElementOfResult?”

为什么不起作用?似乎应该这样

你说得对。两个示例都应该编译,因为

  • 已在Swift 5中实施,并且
  • 已在Swift 5.2中实施
事实上,后一个建议明确提到了一个类似于你的例子。但是,这不会编译(从Xcode 11.7和Xcode 12 beta开始):

这是一个错误。据报道,这是一个严重的问题

bug报告提到了一个自定义扩展作为可能的解决方法:

[1, nil, 3, nil, 5].compactMap(\.self)
// error: generic parameter 'ElementOfResult' could not be inferred

写你自己的
identity
函数怎么样?@Sweeper这是一个有趣的想法)))但是为什么KeyPath在这里不起作用呢?从措辞上看,它似乎是
\。self
是一种特殊情况,处理方式有所不同。它甚至有自己的名字“身份密钥路径”。在我看来,它就像一个bug。根据(在Swift 5.2中实现)应该
let filtered=[1,nil,3,nil,5].compactMap(\.self)
compile。但事实并非如此(使用Xcode 11和12 beta进行测试)。这是一个bug:
let test = [4, 5, nil, 3, 1, nil, 3]
print(
    test.compactMap { $0 }
)
print(
    test.compactMap(\.self)  // Doesn't compile  
)
[1, nil, 3, nil, 5].compactMap(\.self)
// error: generic parameter 'ElementOfResult' could not be inferred
extension Optional { var mySelf: Self { self } }

[1, nil, 3, nil, 5].compactMap(\.mySelf)