【问题标题】:Add custom .colorNames to UIColor somehow?以某种方式将自定义 .colorNames 添加到 UIColor?
【发布时间】:2017-01-08 16:42:24
【问题描述】:

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

myLabel.fontColor = .gray

自己制作,像这样:

static let fadedGreen = SKColor.init(hue: 0.33,
                                     saturation: 1,
                                     brightness: 0.33,
                                     alpha: 1.0)

但这需要调用我放入的类以使用缩写fadedGreen,如下所示:

myLabel.fontColor = MyStorageClass.fadedGreen

问题:

有没有一种方法可以扩展或以其他方式添加到(我假设是)UIColor 的枚举预设中,这样我就可以制作自己的颜色并像这样使用.dot:

myLabel.fontColour = .myCustomColor

...从我项目的任何地方?

这是否意味着 SKColor .presets 也可以立即使用它们?

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

【问题讨论】:

    标签: swift colors sprite-kit uicolor


    【解决方案1】:

    这些并不是真正的颜色快捷方式。那只是推断一种类型。 fontColor 属性类型为 UIColor,UIColor 在 class 上有一堆只读属性,它们是颜色名称并返回颜色对象。所以当你说

    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

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

    【讨论】:

    • 我更希望将不成文的“dazed”部分缩写为:.dzd_pink ;)
    • 请注意,您不需要在计算属性中显式 get { }。此外,如果此扩展仅供 Swift 代码使用,您可以将计算属性标记为 @nonobjc,这意味着您无需担心冲突,因此可以删除前缀。
    • @Hamish 很抱歉提出这么愚蠢的问题:你把@nonobjc 放在代码的什么位置?
    • @Hamish 你是对的,而不是 getter,我也可以在类扩展的范围内让它只是一个静态的 let。不太确定在这里使用@nonobjc(它会在静态之前使用),因为这只会保护我们免受ObjC代码的影响,但仍然很容易在编译时引起冲突。此外,如果需要,它会使这些方法对我的应用程序中必须用 ObjC 编写的任何部分都不可用)。所以我认为它主要提供了虚假的安全性。
    • @uliwitness static let 确实是个好主意。我或许应该用@nonobjc 重新表述我的“不需要担心冲突”——冲突仍然可能发生,但只有当UIColor 的两个扩展定义了同名的新颜色在同一范围内可用。因此,由于 Swift 的访问修饰符,这可以相当容易地进行管理。但是,即使您确实遇到了冲突,正如您所说,您也会收到编译器错误。这比在运行时获得潜在的意外行为更可取,因为 Obj-C 命名冲突会发生这种情况。
    【解决方案2】:

    您可以简单地准备一个包含所有海关常量的 .swift 文件,例如:

    Constants.swift:

    import Foundation
    import UIKit
    
    // MY COLORS
    let sandColor = UIColor(red: 239/255, green: 212/255, blue: 111/255, alpha: 1)
    

    然后,您可以在代码中的任何位置(不带点):

    mySprite.color = sandColor
    

    显然您也可以将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()
    

    【讨论】:

    • 这就是所谓的“全局”变量吗?
    • 全局变量是在任何函数、方法、闭包或类型上下文之外定义的变量。全局常量和变量总是延迟计算。 SAND 不是变量(“let”)
    • 是吗?还是不?
    • 全局属性,我是说。
    • @Confused 您可能不关心全局命名空间,但问题是 Apple 也不关心(他们假设他们拥有它),您使用的库的作者可能有类似的傲慢方法。所以如果你不避免污染全局命名空间,你可能有一天会因为冲突而得到奇怪的错误。最好留在自己的命名空间中,从而不必处理这些问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多