SwiftUI 中的 .background() 修饰符中的 .background 出错

`.background` goes wrong in `.background()` modifier in SwiftUI

我正在尝试创建 ButtonStyle。我想让背景色为Assets.xcassets中已经创建的buttonBackgroundHover色,其他时间保持默认背景色(与window的背景色相同)。所以我尝试了下面的代码,但是Xcode说了一个错误:Member 'background(ignoresSafeAreaEdges:)' expects argument of type 'Color'

struct PlayerButton: ButtonStyle {

    @State private var isOnHover: Bool = false

    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .background(isOnHover ? Color("buttonBackgroundHover") : .background)
    }
}

但如果我用 .background(.background) 替换 .background(isOnHover ? Color("buttonBackgroundHover") : .background),就没有争论了。我想知道这有什么问题,我该如何解决这个问题。非常感谢您的帮助。

没有颜色 Color.background - 它尝试应用相同的 .background() 修饰符,但在三元运算符中首先是颜色,因此类型冲突 - 错误。

我认为这是预期的

.background(isOnHover ? Color("buttonBackgroundHover") : 
                        Color(uiColor: UIColor.systemBackground))  // << this !!

background方法声明如下:

func background<S>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View where S : ShapeStyle

请注意,它采用的参数类型为 S,其中 S : ShapeStyle。当您执行 .background(.red).background(.background) 时,S 分别为 ColorBackgroundStyle

然而,当你传入:

isOnHover ? Color("buttonBackgroundHover") : .background

没有一种类型 S 有效。你想让S或者Color或者BackgroundStyle,但是上面表达式的类型可以只是这些类型中的一种。编译器看到由于 Color("buttonBackgroundHover")Color 类型,它错误地认为您希望第三个操作数 .background 也是 Color 类型。但是没有 Color.background 这样的 属性,但是由于 Color 是一个视图,它也有一个 background 方法,这就是 .background 得到解决的方法到。它需要一个 Color 参数,因为您正在调用没有实例的实例方法 (Color.background).

无论如何,ShapeStyle - AnyShapeStyle 有一个类型橡皮擦。应用它使条件表达式的两个分支成为同一类型:

.background(isOnHover ? AnyShapeStyle(Color("buttonBackgroundHover")) : AnyShapeStyle(.background))