You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:17:05