枚举方法调用解析为“未使用的函数”

时间:2014-10-05 20:17:50

标签: methods swift enums swift-playground

我一直在使用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"

4 个答案:

答案 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)"