Как сравнить два линейных градиента? SwiftUI - PullRequest
1 голос
/ 24 февраля 2020

У меня есть несколько градиентов в качестве тем для моего приложения. Я хочу иметь bool, который становится истинным, когда градиент (хранящийся в переменной) является заданным c. Тем не менее, я получаю сообщение об ошибке:

«Двоичный оператор» == «нельзя применить к двум операндам 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  
}  

1 Ответ

2 голосов
/ 24 февраля 2020

Вы не можете сделать это напрямую. Большинство представлений 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: ...
        }
    }
}
...