如何比较两个LinearGradients? SwiftUI

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

我有多个渐变作为我的应用程序的主题。我希望当渐变(存储在变量中)为特定渐变时,布尔值变为true。但是,我不断收到错误:

“二进制运算符'=='不能应用于两个'LinearGradient'操作数“

请帮助!

这是我的代码:

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  
}  
ios swift xcode swiftui linear-gradients
1个回答
0
投票

您不能直接执行此操作。大多数SwiftUI视图都是“只写的”。创建它们后,就不能再问它们是如何创建的了。 (路径是该规则的明显例外。)

相反,我建议将您的状态与渐变视图本身隔离开。例如,您可以创建一个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: ...
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.