以最简单的形式在 map() 中应用 KeyPath

Apply KeyPath in map() in simplest form

let test = [4, 5, 3, 1, 3]
print(
    test.map { [=10=] }
)
print(
    test.map(\.self)  // Doesn't compile  
)

错误:

Type of expression is ambiguous without more context

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

也许使用 compactMap 的例子会更有意义))

let test = [4, 5, nil, 3, 1, nil, 3]
print(
    test.compactMap { [=11=] }
)
print(
    test.compactMap(\.self)  // Doesn't compile  
)

错误:

Cannot convert value of type 'WritableKeyPath<_, _>' to expected argument type '(Int?) throws -> ElementOfResult?'

Why doesn't it work? Seems like it should.

你是对的。你的两个例子都应该编译因为

实际上后一个提案明确提到了一个类似于你的例子。但是,这不会编译(从 Xcode 11.7 和 Xcode 12 beta 开始):

[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)