我正在制作一个学习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'

最佳答案

作为@Sulthan says,您真的不应该为此使用实用程序类(更不用说继承自final的非-NSObject实用程序类了!).
您应该将hexStringToUIColor移到一个UIColor扩展中,我建议您也使用一个方便的初始化器。如果仍然需要名称空间,可以使用无案例enum(这比structclass更可取,因为它可以防止初始化)。
另外,我建议不要使用数组来存储十六进制颜色字符串(除非您出于某种原因实际需要遍历它们)。mColors[0]不会说“red”,所以用实际的名称替换它们。作为static对象,而不是UIColors,它们也可能更有用。
下面是这些建议的一个例子:

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

10-08 09:27