我正在阅读官方的 Swift 编程语言文档 并在 Playgrounds 中编写代码片段示例。目前,我正在使用“函数类型作为返回类型”,这看起来非常简单。我正在使用 Xcode 16.2 从
函数类型作为返回类型部分复制的以下代码片段如下:
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
但是,stepBackward(和stepForward)的三元运算符会出现以下错误:“如果没有类型注释,表达式的类型不明确。”
这是一个干净的 Playgrounds 工作区,删除了默认的 Hello World 以验证行为。
我可以通过编写显式类型注释来解决此问题,如下所示:
let forwardFunc: (Int) -> Int = stepForward
let backwardFunc: (Int) -> Int = stepBackward
@MainActor func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? backwardFunc : forwardFunc
}
据我了解,这是一个很好的做法,但“函数”部分中的文档并未明确说明这是必需的。
最近 Swift 中是否发生了某些变化,导致文档过时?现在是否需要在这些情况下编写显式类型注释?我想了解为什么在这种情况下现在需要类型注释,特别是使用推断函数类型的三元运算符。
sendForward
和
sendBackward
函数隐式标记为 @Sendable
导致的。通过更新以下代码解决了该问题:
@MainActor func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? backwardFunc : forwardFunc
}
至:
@MainActor func chooseStepFunction(backward: Bool) -> @Sendable (Int) -> Int {
return backward ? backwardFunc : forwardFunc
}
注意添加了
@Sendable
作为函数的返回类型。
另一个解决方法是拆分return
线:
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
let sendableFunc = backward ? stepBackward : stepForward
return sendableFunc // casts `@Sendable (Int)->Int` to `(Int) -> Int`
}