以最简单的形式在 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.
你是对的。你的两个例子都应该编译因为
- SE-0227 Identity Keypath 已在 Swift 5 中实现,并且
- SE-0249 Key Path Expressions as Functions 已在 Swift 5.2 中实现。
实际上后一个提案明确提到了一个类似于你的例子。但是,这不会编译(从 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)
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.
你是对的。你的两个例子都应该编译因为
- SE-0227 Identity Keypath 已在 Swift 5 中实现,并且
- SE-0249 Key Path Expressions as Functions 已在 Swift 5.2 中实现。
实际上后一个提案明确提到了一个类似于你的例子。但是,这不会编译(从 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)