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

错误:

在没有更多上下文的情况下,表达式的类型是模棱两可的

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

也许compactMap的例子会更香))

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

错误:

无法将 'WritableKeyPath<_, _>' 类型的值转换为预期的参数类型 '(Int?) throws -> ElementOfResult?'

4

1 回答 1

6

为什么它不起作用?似乎应该如此。

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

事实上,后一个提案明确提到了一个与您类似的示例。但是,这不会编译(从 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)
于 2020-09-04T04:58:02.643 回答