Swiftui:从 JSON 获取动态颜色渐变?

Swiftui: Fetch Dynamic Color Gradient from JSON?

对于数组中的每个项目,我想加载 JSON 中定义的动态颜色渐变。每个项目都有不同的颜色。

在 JSON 中,我将十六进制值存储在 [String] 中。我可以使用这些从此处使用扩展名加载 Color(hex: String):

我正在考虑按照以下思路进行实施,但是 Xcode 会抛出各种错误,此外,感觉就像一个 hack。我错过了什么?

示例模型:

struct Item: Codable, Identifiable, Hashable {
    let colors: [String]
}

详细视图示例:

struct DetailView: View {

    let item: Item
    let gradientColors: [Color]

    init(item: Item){
        self.item = item
        ForEach(item.colors) { color in
            gradientColors.append(Color(hex: color))
        }
    }

    var body: some View {
        Circle()
            .background(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
    }
}

在 SwiftUI 中,ForEach 是一个视图,可以让您传递一组数据视图,类似于 UIKit 中 UIView 的子视图。所以你不能在 init 方法中使用它。更多 (https://developer.apple.com/documentation/swiftui/foreach)

正确使用代码:

struct Item: Codable, Identifiable {
    var id = UUID()
    let colors: [String]
}

struct ContentView: View {
    let item: Item
    
    init(item: Item){
        self.item = item
    }
    
    var body: some View {
        Circle()
            .fill(LinearGradient(gradient: Gradient(colors: item.colors.map{Color(hex: [=10=])}), startPoint: .leading, endPoint: .trailing))
    }
}

如果您想使用 forEach 迭代数组,您需要使用与旧方法相同的方法。

示例:

struct ContentView: View {
    let item: Item
    
    var gradientColors: [Color] = []
    
    init(item: Item){
        self.item = item
        item.colors.forEach { (strColor) in
            gradientColors.append(Color(hex: strColor))
        }
    }
    
    var body: some View {
        Circle()
            .fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
    }
}

另外,还有一件事。如果您尝试向圆圈添加渐变,它不适用于 .background(LinearGradient。为此,您需要使用 .fill

var body: some View {
        Circle()
            .fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
    }