首页 > 解决方案 > Apple 建议使用什么:自定义结构或扩展?

问题描述

有什么推荐的?

下面的示例只是一个示例函数,它从红色、绿色和蓝色值返回 UIColor,而无需将数字除以 255。代码是用 Swift 5 编写的。

例如:

struct colorFrom {

    func RGB(r: CGFloat, g: CGFloat, b: CGFloat) -> UIColor {

        var red, green, blue, alpha: CGFloat
        red = r / 255
        green = g / 255
        blue = b / 255
        alpha = 1

        var color: UIColor
        color = UIColor(red: red, green: green, blue: blue, alpha: alpha)

        return color

    }

}

extension UIColor {

    func RGB(r: CGFloat, g: CGFloat, b: CGFloat) -> UIColor {

        var red, green, blue, alpha: CGFloat
        red = r / 255
        green = g / 255
        blue = b / 255
        alpha = 1

        var color: UIColor
        color = UIColor(red: red, green: green, blue: blue, alpha: alpha)

        return color

    }

}

colorFrom().RGB(r: 153, g: 153, b: 153)
UIColor().RGB(r: 153, g: 153, b: 153)

标签: iosswift

解决方案


Apple 没有任何官方顾问来衡量这两种设计选择 AFAIK 之间的区别。

话虽如此,扩展中的便利初始化程序或静态方法UIColor非常有意义。但不是实例方法,而是static方法。

但考虑到 RGB 值通常表示为 0.0 到 1.0 之间的值,我可能会认为您期望 0 到 255 之间的值在参数标签和快速帮助中都非常明确,例如:

extension UIColor {
    /// Initializes and returns a color object using the specified RGB component values represented as
    /// values between 0 and 255 (rather than between the customary 0.0 to 1.0).
    ///
    /// - Parameters:
    ///   - red: Value between 0 and 255.
    ///   - green: value between 0 and 255.
    ///   - blue: Value between 0 and 255.

    convenience init(eightBitRed red: CGFloat, green: CGFloat, blue: CGFloat) {
        self.init(red: red/255, green: green/255, blue: blue/255, alpha: 1)
    }
}

然后您可以执行以下操作:

let plum = UIColor(eightBitRed: 148, green: 33, blue: 147)

仅针对这种方法的自定义struct(同样,如果您这样做,这将是一种static方法),也可能没有意义。如果您有一堆方法在 a 中进行一些逻辑分组struct,那么您可能会考虑它。但是根据提供的信息,我不会为此创建单独的结构。(如果您要创建struct,则struct的名称应以大写字母开头。)


推荐阅读