自定义环境值和不可发送的错误

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

我有以下代码。我在 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. 

遇到这种情况我能做什么?

swiftui
1个回答
0
投票

这与

@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 }
那样知道任意表达式的类型。

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