Swift 以某种方式将自定义.colorNames添加到UIColor?

Swift 以某种方式将自定义.colorNames添加到UIColor?,swift,colors,sprite-kit,uicolor,Swift,Colors,Sprite Kit,Uicolor,我非常喜欢使用这种颜色的快捷方式: myLabel.fontColor = .gray static let fadedGreen = SKColor.init(hue: 0.33, saturation: 1, brightness: 0.33, alpha: 1.0)

我非常喜欢使用这种颜色的快捷方式:

myLabel.fontColor = .gray
static let fadedGreen = SKColor.init(hue: 0.33,
                                     saturation: 1,
                                     brightness: 0.33,
                                     alpha: 1.0)
myLabel.fontColor = MyStorageClass.fadedGreen
myLabel.fontColour = .myCustomColor
做我自己的,像这样:

myLabel.fontColor = .gray
static let fadedGreen = SKColor.init(hue: 0.33,
                                     saturation: 1,
                                     brightness: 0.33,
                                     alpha: 1.0)
myLabel.fontColor = MyStorageClass.fadedGreen
myLabel.fontColour = .myCustomColor
但这需要调用我放入的类来使用缩写
fadegreen
,如下所示:

myLabel.fontColor = .gray
static let fadedGreen = SKColor.init(hue: 0.33,
                                     saturation: 1,
                                     brightness: 0.33,
                                     alpha: 1.0)
myLabel.fontColor = MyStorageClass.fadedGreen
myLabel.fontColour = .myCustomColor
问题: 是否有一种方法可以扩展或以其他方式添加(我假设是)UIColor的枚举预设,以便我可以制作自己的颜色,只需使用一个
点,如下所示:

myLabel.fontColor = .gray
static let fadedGreen = SKColor.init(hue: 0.33,
                                     saturation: 1,
                                     brightness: 0.33,
                                     alpha: 1.0)
myLabel.fontColor = MyStorageClass.fadedGreen
myLabel.fontColour = .myCustomColor
。。。从我项目的任何地方

这是否意味着SKColor
。预设也可以立即使用


请原谅我完全不知道如何做这样的事情。

您只需准备一个包含所有海关常量的.swift文件,例如:

常数。swift:

import Foundation
import UIKit

// MY COLORS
let sandColor = UIColor(red: 239/255, green: 212/255, blue: 111/255, alpha: 1)
然后,您可以在代码中的任何位置执行(无点):

显然,您还可以将
UIColor
扩展为:

extension UIColor{
    class func fadedGreen() -> UIColor{
        return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00)
    }
}
用法

let myColor = UIColor.fadedGreen()

这些并不是真正的色彩捷径。那只是推断一种类型。
fontColor
属性被键入为UIColor,UIColor在类上有一组只读属性,它们是颜色名称和返回颜色对象。所以当你说

myLabel.fontColor = .myCustomColor
圆点告诉它“这是某个地方的字段,猜猜在哪里”,Swift说,我需要一个
UIColor
,所以让我们看看
UIColor
类是否具有返回正确类型的名称属性

因此,要添加自己的颜色属性,必须在UIColor的扩展中定义颜色属性

extension UIColor {
    static let con_pink = UIColor( red: 1.0, green: 0.0, blue: 0.5, alpha: 1.0 )
}
还有那些可以用作myLabel.fontColor=.con_pink


但请注意,如果你这样做,你就有可能与苹果未来可能添加的任何颜色方法发生冲突。因此,我建议您在属性名称中添加前缀(我根据您的用户名为您选择了“con_”),以减少Apple使用相同名称的可能性。

这就是所谓的“全局”变量吗?全局变量是在任何函数、方法、闭包之外定义的变量,或类型上下文。全局常量和变量始终是惰性计算的。沙子不是一个变量(“let”),是吗?或者是一个非全局属性,我的意思是,你可能不关心全局名称空间,但问题是苹果也不关心(他们假设自己拥有它),你使用的库的作者可能也有类似的傲慢态度。因此,如果不避免污染全局名称空间,某一天可能会由于冲突而出现奇怪的错误。最好留在您自己的名称空间中,这样就不必处理这些问题。我更希望不成文的“发呆”部分缩写为:
.dzd_pink
;)注意,在computed属性中不需要显式的
get{}
。此外,如果此扩展仅由Swift代码使用,您可以将计算属性标记为
@nonobjc
,这意味着您无需担心冲突,因此可以删除前缀。@Hamish很抱歉问这么一个愚蠢的问题:您将
@nonobjc
放在代码中的什么位置?@Hamish您是对的,我还可以在类扩展的作用域中将其作为静态let,而不是getter。不太确定是否在这里使用
@nonobjc
(在静态代码之前),因为这只会保护我们不受ObjC代码的影响,但在编译时仍然很容易导致冲突。而且,如果需要的话,我的应用程序中必须用ObjC编写的任何部分都无法使用这些方法)。所以我认为它主要提供虚假的安全性。@uliwitness
static let
确实是个好主意。我也许应该用
@nonobjc
重新表述我的“不必担心冲突”——冲突仍然可能发生,但只有当
UIColor
的两个扩展定义了相同名称的新颜色并在相同范围内可用时才会发生。因此,由于Swift的访问修饰符,这可以相当容易地进行管理。但是,正如您所说,即使您确实遇到冲突,也会出现编译器错误。这比在运行时获得潜在的意外行为要理想得多,这是Obj-C命名冲突会发生的情况。