为什么会出现“没有类型注释,表达式的类型不明确”。在 Swift 中对推断函数类型使用三元运算符时出错?

问题描述 投票:0回答:1

我正在阅读官方的 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)的三元运算符会出现以下错误:“如果没有类型注释,表达式的类型不明确。”

Screenshot of the error in Playgrounds 这是一个干净的 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 中是否发生了某些变化,导致文档过时?现在是否需要在这些情况下编写显式类型注释?我想了解为什么在这种情况下现在需要类型注释,特别是使用推断函数类型的三元运算符。

swift swift-playground swift6
1个回答
0
投票
Swift 论坛

上的一些讨论。 此问题在 Swift 6 中出现,是由于

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`
}

	
© www.soinside.com 2019 - 2024. All rights reserved.