我正在制作一个学习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
(这比struct
或class
更可取,因为它可以防止初始化)。
另外,我建议不要使用数组来存储十六进制颜色字符串(除非您出于某种原因实际需要遍历它们)。mColors[0]
不会说“red”,所以用实际的名称替换它们。作为static
对象,而不是UIColor
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