Apple建议使用什么:自定义结构或扩展名?

时间:2019-05-10 21:15:28

标签: ios swift

推荐什么?

  • 选项1:自定义结构
  • 选项2:扩展到一个类

下面的示例只是一个示例函数,该函数从红色,绿色和蓝色值返回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)

1 个答案:

答案 0 :(得分:2)

苹果公司没有任何官方顾问在权衡这两种设计选择AFAIK之间的区别。

话虽这么说,UIColor扩展中的便捷初始化程序或静态方法很有意义。但不是实例方法,而是static方法。

但是考虑到通常将RGB值表示为0.0到1.0之间的值,我很可能会得出这样的事实:您期望参数标签和快速帮助,例如:

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方法),也可能没有任何意义。如果您有一堆在struct内进行逻辑分组的方法,那么您可以考虑一下。但是根据提供的信息,我不会为此创建单独的结构。 (而且,如果您要创建struct,则struct的名称应以大写字母开头。)