我有以下代码。我在 SwiftUI 视图中使用 Environment(.showMessage) 仅用于显示和隐藏视图。当我使用 Swift 6 编译此代码时,出现错误(如最后所示)。
struct ShowMessageAction {
typealias Action = (String, MessageType) -> ()
let action: Action
func callAsFunction(_ message: String, _ messageType: MessageType = .error) {
action(message, messageType)
}
}
extension EnvironmentValues {
@Entry var showMessage = ShowMessageAction { _, _ in }
}
Static property 'defaultValue' is not concurrency-safe because non-'Sendable' type 'ShowMessageAction' may have shared mutable state.
遇到这种情况我能做什么?
这与
@Entry
如何生成 defaultValue
属性非常相关(另见我的答案here)。
当前代码中的@Entry
会生成
static let defaultValue = ShowMessageAction { _, _ in }
正如我在链接答案中所解释的那样,被认为是不安全的,因为
ShowMessageAction
不是 Sendable
。
如果您显式指定属性的类型,我们希望 defaultValue
to be a computed property, so there is no global state.
@Entry` 可以 这样做。
@Entry var showMessage: ShowMessageAction = .init { _, _ in }
@Entry
不可能在没有显式类型的情况下生成计算属性,因为计算属性需要显式类型注释,但宏无法像ShowMessageAction { _, _ in }
那样知道任意表达式的类型。