如何在Swift与SwiftUI混合项目中统一Color和UIColor工具类?
Swift/SwiftUI 统一颜色工具类的最佳实践
在同时涉及UIKit(Swift)和SwiftUI的项目中,维护UIColor和Color两个重复的扩展确实容易增加维护成本,下面分享几种能解决这个问题的最佳实践:
方案一:通过协议统一约束
定义一个协议来规范应用内的颜色属性,让UIColor和Color分别遵守该协议,核心颜色逻辑只在UIColor中实现,Color直接复用,既保证调用简洁,又避免重复代码:
// 定义颜色协议,规范所有应用颜色属性 protocol AppColor { static var appBlack: Self { get } // 可按需添加更多应用颜色,比如appRed、appBlue等 } extension UIColor: AppColor { static var appBlack: UIColor { UIColor(hex: #000814) } } extension Color: AppColor { static var appBlack: Color { Color(UIColor.appBlack) } }
调用时依然保持简洁写法:
// SwiftUI中 let swiftuiColor: Color = .appBlack // UIKit中 let uikitColor: UIColor = .appBlack
方案二:集中管理颜色原始值
创建一个专门的颜色配置结构体,把所有颜色的原始值(比如十六进制值)集中存放,再分别给UIColor和Color做扩展读取这些值,修改颜色时只需要改动配置结构体,不用修改两个扩展:
// 集中管理所有颜色的原始定义 struct AppColorPalette { static let appBlackHex: UInt = #000814 static let appPrimaryBlueHex: UInt = #2196F3 // 更多颜色... } extension UIColor { static var appBlack: UIColor { UIColor(hex: AppColorPalette.appBlackHex) } static var appPrimaryBlue: UIColor { UIColor(hex: AppColorPalette.appPrimaryBlueHex) } } extension Color { static var appBlack: Color { Color(UIColor.appBlack) } static var appPrimaryBlue: Color { Color(UIColor.appPrimaryBlue) } }
方案三:优先维护SwiftUI的Color扩展(适合SwiftUI为主的项目)
如果项目以SwiftUI开发为主,UIKit部分占比很小,可以只定义Color的扩展,在UIKit中通过UIColor(Color.appBlack)的方式转换使用,这样只需要维护一个扩展:
extension Color { static var appBlack: Color { Color(UIColor(hex: #000814)) } } // UIKit中使用 let uikitColor = UIColor(Color.appBlack)
对比你之前的两种实现,以上方案既避免了重复代码的维护问题,又保留了.appBlack这种简洁的调用方式,不用写.init(.appBlack)。
内容的提问来源于stack exchange,提问作者musakokcen
相关产品推荐
相关产品推荐

