我一直在使用Xcode Playgrounds在Swift中乱搞。我知道Swift枚举比它们的Obj-C等价物强大得多。所以我想我将包含颜色的枚举作为成员值,并在枚举中添加一个方法来获取颜色的十六进制值。
然而,我收到错误 - “表达式解析为未使用的函数”。我觉得这可能与让方法接受成员值作为参数有关,但我可能错了。代码如下。有人可以启发我吗?
enum Color {
case Red,Blue,Yellow
func hexValue (aColor: Color) -> String { //Find hex value of a Color
switch aColor {
case .Red:
return "#FF0000"
case .Yellow:
return "#FFFF00"
case .Blue:
return "#0000FF"
default:
return "???????"
}
}
}
Color.hexValue(Color.Red) //Error: "Expression resolves to an unused function"
答案 0 :(得分:9)
将static
添加到hexValue
的声明中,以创建可从没有实例的类型调用的类型方法:
enum Color {
case Red,Blue,Yellow
static func hexValue (aColor: Color) -> String { //Find hex value of a Color
switch aColor {
case .Red:
return "#FF0000"
case .Yellow:
return "#FFFF00"
case .Blue:
return "#0000FF"
default:
return "???????"
}
}
}
Color.hexValue(Color.Red) // "#FF0000"
或者你可以通过使它成为计算属性:
来使这更好enum Color {
case Red,Blue,Yellow
var hexValue: String {
get {
switch self {
case .Red: return "#FF0000"
case .Yellow: return "#FFFF00"
case .Blue: return "#0000FF"
}
}
}
}
Color.Red.hexValue // "#FF0000"
答案 1 :(得分:1)
您必须将hexValue
函数定义为static,因为您不是从实例调用它。
请注意,default
情况是不必要的,因为所有可能的值都已在switch语句中处理。
然而,快速的枚举比这更强大。这是我实现它的方式,利用原始值:
enum Color : String {
case Red = "#FF0000"
case Blue = "#FFFF00"
case Yellow = "#0000FF"
static func hexValue(aColor: Color) -> String {
return aColor.toRaw()
}
}
并使用以下方法获取字符串表示:
Color.hexValue(Color.Red)
hexValue
方法虽然多余,因为您可以使用:
Color.Red.toRaw()
答案 2 :(得分:0)
只需阅读错误消息!
let color = Color.hexValue(Color.Red)
您必须将返回值分配给某些内容
答案 3 :(得分:0)
另一种选择是使用Printable
协议并在你的枚举上实现description
计算属性,然后你可以使用字符串插值来引用它的值。
enum Color: Printable {
case Red,Blue,Yellow
var description: String {
get {
switch self {
case .Red: return "#FF0000"
case .Yellow: return "#FFFF00"
case .Blue: return "#0000FF"
}
}
}
}
let myColor = "\(Color.Red)"