如何比较两个线性渐变?斯威夫特用户界面

How to compare two LinearGradients? SwiftUI

我有多个渐变作为我的应用程序的主题。当梯度(存储在变量中)是特定梯度时,我想要一个变为真的布尔值。但是,我不断收到错误消息:

"Binary operator '==' cannot be applied to two 'LinearGradient' operands"

请帮助!

这是我的代码:

let pinkGradient = LinearGradient(gradient: Gradient(colors:[Color(red: 123/255, green: 30/255, blue: 122/255), Color(red: 248/255, green: 74/255, blue: 167/255)]), startPoint: .bottomLeading, endPoint: .topTrailing)  
let blueGradient = LinearGradient(gradient: Gradient(colors:[Color(red: 0/255, green: 52/255, blue: 89/255), Color(red: 0/255, green: 168/255, blue: 232/255)]), startPoint: .bottomLeading, endPoint: .topTrailing)  
let yellowGradient = LinearGradient(gradient: Gradient(colors:[Color(red: 240/255, green: 30/255, blue: 50/255), Color(red: 255/255, green: 189/255, blue: 0/255)]), startPoint: .bottomLeading, endPoint: .topTrailing)  


if userData.selectedTheme == pinkGradient { //This is where the error occurs  
     self.isPinkThemeSelected = true  
} else if userData.selectedTheme == blueGradient { //This is where the error occurs  
     self.isBlueThemeSelected = true  
} else {  
     self.isYellowThemeSelected = true  
}  

您不能直接执行此操作。大多数 SwiftUI 视图都是 "write-only." 一旦你创建了它们,你就不能问它们是如何创建的。 (路径是此规则的一个明显例外。)

相反,我建议将您的状态与渐变视图本身隔离开来。例如,您可以创建一个 Theme 结构,例如:

struct Theme: Identifiable {
    let id = UUID() // This ensures that even two themes with the same name are unique
    let name: String // This is just for your convenience
    let gradient: LinearGradient
}

extension Theme: Equatable {
    static func == (lhs: Theme, rhs: Theme) -> Bool { lhs.id == rhs.id }
}

let pinkTheme = Theme(name: "pink",
                      gradient: LinearGradient(gradient: Gradient(colors:[
                        Color(red: 123/255, green: 30/255, blue: 122/255),
                        Color(red: 248/255, green: 74/255, blue: 167/255)]),
                                               startPoint: .bottomLeading, endPoint: .topTrailing))

let blueTheme = Theme(name: "blue",
                      gradient: LinearGradient(gradient: Gradient(colors:[
                        Color(red: 0/255, green: 52/255, blue: 89/255),
                        Color(red: 0/255, green: 168/255, blue: 232/255)]),
                                               startPoint: .bottomLeading, endPoint: .topTrailing))

现在您可以追踪 selectedThem == pinkTheme

如果你有固定数量的主题,你也可以更简单地实现它作为一个枚举:

enum Theme: Equatable {
    case pink
    case blue
    case yellow

    var gradient: LinearGradient {
        switch self {
        case .pink: return LinearGradient(gradient: Gradient(colors:[
            Color(red: 123/255, green: 30/255, blue: 122/255),
            Color(red: 248/255, green: 74/255, blue: 167/255)]),
                                          startPoint: .bottomLeading, endPoint: .topTrailing)
        case .blue: ...
        case .yellow: ...
        }
    }
}