所以基本上我有一个主题数组,一个主题的一个属性是RGBAColor,它基本上是4个双精度.我故意不存储 colored颜色 struct ,因为我不希望像 colored颜色 这样的UI东西出现在我的模型中,它是独立于用户界面的.在我的ViewModel中,我将这个RGBAColor"解释"为一个普通的 colored颜色 struct .
我希望用户能够通过 colored颜色 Select 器更改主题的 colored颜色 属性,但由于ColorPicker接受 colored颜色 的绑定,而不是RGBAColor,所以我遇到了一些麻烦.有人告诉我,提示是创建一个到计算变量的绑定,所以我做了一个
extension Theme {
var color: Binding<Color> {
Binding {
return Color(rgbaColor: self.rgbaColor)
} set: { newRGBAColor in
self.rgbaColor = RGBAColor(color: newRGBAColor)
}
}
}
但这是行不通的,因为self 是不变的.我怎么才能解决这个问题呢?
struct ThemeEditor: View {
@Binding var theme: Theme
var colorSection: some View {
Section(header: Text("Colors")) {
VStack {
ColorPicker("Selection", selection: $theme.color)
}
}
}
}
struct RGBAColor: Codable, Equatable, Hashable {
let red: Double
let green: Double
let blue: Double
let alpha: Double
}
extension RGBAColor {
init(color: Color) {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
if let cgColor = color.cgColor {
UIColor(cgColor: cgColor).getRed(&red, green: &green, blue: &blue, alpha: &alpha)
}
self.init(red: Double(red), green: Double(green), blue: Double(blue), alpha: Double(alpha))
}
init(_ red: Double, _ green: Double, _ blue: Double, _ alpha: Double) {
self.init(red: red/255, green: green/255 , blue: blue/255, alpha: alpha)
}
}
extension Color {
init(rgbaColor rgba: RGBAColor) {
self.init(.sRGB, red: rgba.red, green: rgba.green, blue: rgba.blue, opacity: rgba.alpha)
}
}
struct Theme: Identifiable, Codable, Hashable {
var name: String
var emojis: String
var id: Int
var numberOfPairsOfCards: Int
var rgbaColor: RGBAColor
fileprivate init(name: String, emojis: String, id: Int, numberOfPairsOfCards: Int, rgbaColor: RGBAColor) {
self.name = name
self.emojis = emojis
self.id = id
self.numberOfPairsOfCards = numberOfPairsOfCards
self.rgbaColor = rgbaColor
}
}