ios - 如何比较两个线性渐变? swift 用户界面

标签 ios swift xcode swiftui linear-gradients

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

"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 View 都是“只写的”。一旦你创建了它们,你就无法询问它们是如何创建的。 (路径是此规则的一个显着异常(exception)。)

相反,我建议将您的状态与渐变 View 本身隔离。例如,您可以创建一个 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: ...
        }
    }
}

关于ios - 如何比较两个线性渐变? swift 用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60367808/

相关文章:

ios - 为什么 AFNetworking 在第一次请求时挂起?

objective-c - 从 NSArray 以字节形式检索 UIImage - iOS

ios - 使用 sambag 时间选择器时出现问题

ios - 从 Storyboard导航到其他 Swift 1.2 文件时 Xcode 6.3 崩溃

ios - UI 测试时无法选择 UIPicker

ios - FirebaseDatabase - removeAllObservers() - 它实际上删除了什么?

ios - uiwebview 加载请求不工作 ios

ios - RealmSwift 与 Alamofire5

ios - 显示HTML和CSS文件

ios - 更改 Main.storyboard 的位置?