我正在制作游戏以学习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'
答案 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
(这比struct
或class
优先,因为它可以防止初始化。)
另外我建议不要使用数组来存储你的十六进制颜色字符串(除非你实际上需要因为某些原因迭代它们)。 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)