🎨
UIColor, foregroundColor, foregroundStyle全部で書ける色の定義方法のアイデア
このように書きたい
let color: UIColor = .app.blue01
_ = Text("")
.foregroundStyle(.app.blue01)
.foregroundStyle(.app.blue02)
.foregroundColor(.app.blue01)
定義
// Definitions
public struct ColorDescriptors: Sendable {
public var blue01: ColorDescriptor = .init(hex: 0xFF0000)
public var blue02: ColorDescriptor = .init(hex: 0xFF0000)
}
そのほかの実装
import UIKit
import SwiftUI
public struct ColorDescriptor: Sendable {
let r: Double
let g: Double
let b: Double
// TODO: let colorSpace
init(hex: Int) {
self.r = Double((hex >> 16) & 0xFF) / 255.0
self.g = Double((hex >> 8) & 0xFF) / 255.0
self.b = Double(hex & 0xFF) / 255.0
}
var swiftUIColor: Color {
return .init(.sRGB, red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b))
}
var uiColor: UIColor {
return .init(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: 1.0)
}
}
@dynamicMemberLookup
public struct Edges: ShapeStyle {
public static let descriptors: ColorDescriptors = .init()
public subscript(dynamicMember member: KeyPath<ColorDescriptors, ColorDescriptor>) -> UIColor {
Self.descriptors[keyPath: member].uiColor
}
public subscript(dynamicMember member: KeyPath<ColorDescriptors, ColorDescriptor>) -> Color {
Self.descriptors[keyPath: member].swiftUIColor
}
}
extension UIColor {
public static var app: Edges {
.init()
}
}
extension Color {
public static var app: Edges {
.init()
}
}
extension ShapeStyle where Self == Edges {
public static var app: Edges {
.init()
}
}
Discussion