🎨

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