带数组的实用程序类

时间:2017-02-03 18:02:25

标签: swift

我正在制作游戏以学习Swift并尝试使代码更清洁,更好。 我做了一个名为Utilities的课程:

    class Utilities: NSObject {

    //Red, Green, Blue, Yellow, Purple
    public let mColors = ["#DA4167", "#81E979","#2B3A67", "#FFFD82", "#3D315B"]

    class func hexStringToUIColor (hex:String) -> UIColor {
        var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

        if (cString.hasPrefix("#")) {
            cString.remove(at: cString.startIndex)
        }

        if ((cString.characters.count) != 6) {
            return UIColor.gray
        }

        var rgbValue:UInt32 = 0
        Scanner(string: cString).scanHexInt32(&rgbValue)

        return UIColor(
            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}

如何在其他课程中使用mColors? 我有另一个类,我正在尝试使用mColors,这就是行:

mRingOne.fillColor = Utilities.hexStringToUIColor(hex: mColors[0])

我收到此错误:

Use of unresolved identifier 'mColors'

3 个答案:

答案 0 :(得分:1)

移动此行:

public let mColors = ["#DA4167", "#81E979","#2B3A67", "#FFFD82", "#3D315B"]

...到"顶级",也就是说,把它放在外面任何花括号的位置(例如类声明的那些,当前它是现在)。

//Red, Green, Blue, Yellow, Purple
public let mColors = ["#DA4167", "#81E979","#2B3A67", "#FFFD82", "#3D315B"]
class Utilities: NSObject {

编辑现在,对不起,我建议了这个。您的Utility类实际上不是一个类 - 它只是某些常量和函数的命名空间。命名空间很好。因此,最好有一个带静态成员的结构,如另一个答案所示:

struct Utilities {
    static let mColors = ["#DA4167", "#81E979","#2B3A67", "#FFFD82", "#3D315B"]
    // ...
}

从任何地方访问的语法都是Utilities.mColors

答案 1 :(得分:1)

作为@Sulthan says,你真的不应该为此使用实用程序类(更不用说继承自final的非NSObject实用程序类了。)。

您应该将hexStringToUIColor移到UIColor分机,我建议您也做一个方便的初始化。如果您仍然需要命名空间,则可以使用无框enum(这比structclass优先,因为它可以防止初始化。)

另外我建议不要使用数组来存储你的十六进制颜色字符串(除非你实际上需要因为某些原因迭代它们)。 mColors[0]并未说“红色”,因此请使用实际名称制作static属性。它们也可能比UIColor个对象更有用,而不是String s。

以下是这些建议的示例:

extension UIColor {

    convenience init(hex: String) {

        var hex = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

        if hex.hasPrefix("#") {
            hex.remove(at: hex.startIndex)
        }

        guard hex.characters.count == 6 else {
            self.init(cgColor: UIColor.gray.cgColor)
            return
        }

        var rgbValue: UInt32 = 0
        Scanner(string: hex).scanHexInt32(&rgbValue)

        self.init(
            red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255,
            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255,
            blue:  CGFloat(rgbValue & 0x0000FF) / 255,
            alpha: 1
        )
    }
}

enum MySpecialColors {
    static let red    = UIColor(hex: "#DA4167")
    static let green  = UIColor(hex: "#81E979")
    static let blue   = UIColor(hex: "#2B3A67")
    static let yellow = UIColor(hex: "#FFFD82")
    static let purple = UIColor(hex: "#3D315B")
}

现在,如果你想使用你的颜色,你只需要说:

mRingOne.fillColor = MySpecialColors.red

答案 2 :(得分:0)

将mColors设置为静态:

static let mColors = ["#DA4167", "#81E979","#2B3A67", "#FFFD82", "#3D315B"]

并称之为:

mRingOne.fillColor = Utilities.hexStringToUIColor(hex: Utilities.mColors[0])

您可以对每种颜色执行静态渲染:

static let myRed = "#DA4167"
static let myGreen = "#81E979"

并称之为:

mRingOne.fillColor = Utilities.hexStringToUIColor(hex: Utilities.myRed)