Ответ: нет - API пока нет, но ...
Большинство структур SwiftUI имеют поля private
, как в Color
.
Вы можете использовать Mirror
для извлечения такой информации, но имейте в виду, что она неэффективна.
Вот как извлечь шестнадцатеричное представление SwiftUI Color
- для образовательных целей.
Скопируйте и вставьте это на Xcode 11 игровую площадку.
import UIKit
import SwiftUI
let systemColor = Color.red
let color = Color(red: 0.3, green: 0.5, blue: 1)
extension Color {
var hexRepresentation: String? {
let children = Mirror(reflecting: color).children
let _provider = children.filter { $0.label == "provider" }.first
guard let provider = _provider?.value else {
return nil
}
let providerChildren = Mirror(reflecting: provider).children
let _base = providerChildren.filter { $0.label == "base" }.first
guard let base = _base?.value else {
return nil
}
var baseValue: String = ""
dump(base, to: &baseValue)
guard let firstLine = baseValue.split(separator: "\n").first,
let hexString = firstLine.split(separator: " ")[1] as Substring? else {
return nil
}
return hexString.trimmingCharacters(in: .newlines)
}
}
systemColor.hexRepresentation
color.hexRepresentation
Цвета, такие как .red
, .white
и т. Д., Похоже, несодержат много информации, когда dumped
.
Просто их "системное" имя.
▿ red
▿ provider: SwiftUI.(unknown context at $1297483bc).ColorBox<SwiftUI.SystemColorType> #0
- super: SwiftUI.(unknown context at $129748300).AnyColorBox
- base: SwiftUI.SystemColorType.red
A Color
, экземпляру которого присвоено red
/ blue
/ green
компоненты делают вместо этого.
▿ #4C80FFFF
▿ provider: SwiftUI.(unknown context at $11cd2e3bc).ColorBox<SwiftUI.Color._Resolved> #0
- super: SwiftUI.(unknown context at $11cd2e300).AnyColorBox
▿ base: #4C80FFFF
- linearRed: 0.073238954
- linearGreen: 0.21404114
- linearBlue: 1.0
- opacity: 1.0
На игровой площадке вы увидите:
systemColor.hexRepresentation
возвращение nil
color.hexRepresentation
возвращение "#4C80FFFF"