Swift - 枚举枚举(或类似的东西)

时间:2015-02-10 09:38:42

标签: ios swift enums protocols subclass

我想做这样的事......

enum SpriteFrames:Int {

    case N
    case NE
    case E
    case SE
    case S
    case SW
    case W
    case NW
}

enum DroidSpriteFramesIdle:Int {

    var image:String {
        switch self {
        case N:
            return "droid_n"
        case NE:
            return "droid_ne"
        case E:
            return "droid_e"
        case SE:
            return "droid_se"
        case S:
            return "droid_s"
        case SW:
            return "droid_sw"
        case W:
            return "droid_w"
        case NW:
            return "droid_nw"
        }
    }

}
enum DroidSpriteFramesMove:Int {

    var image:String {
        switch self {
        case N:
            return "droid_move_n"
        case NE:
            return "droid_move_ne"
        case E:
            return "droid_move_e"
        case SE:
            return "droid_move_se"
        case S:
            return "droid_move_s"
        case SW:
            return "droid_move_sw"
        case W:
            return "droid_move_w"
        case NW:
            return "droid_move_nw"
        }
    }

}

...其中DroidSpriteFramesIdleDroidSpriteFramesMove子类SpriteFrames,或者将其作为协议或类似的东西来遵守。基本上,我想要有很多枚举,它们都有相同的方向列表(N,NE,E等),但是它们有这些常用方向的唯一值列表。我不想使用类,因为这会导致在分配时创建实例。尽管如此,对于其他想法持开放态度,我对Swift来说还是一个新手。感谢。

4 个答案:

答案 0 :(得分:2)

您可以为该枚举创建一个可以充当子类

的别名

前Apple默认:

public enum UITextFieldViewMode : Int {

    case Never
    case WhileEditing
    case UnlessEditing
    case Always
}

ex alias:

public typealias AutoCompleteButtonViewMode = UITextFieldViewMode

你的职能:

func showButtonWithViewMode(buttonViewMode: AutoCompleteButtonViewMode) {

    // Code here
}

用法:

showButtonWithViewMode(.WhileEditing)

答案 1 :(得分:2)

也许分配枚举原始值会更具可读性。

<select name="send_product" id="send-product">
  <option value="wall-mounted" selected>Wall-mounted (Default)</option>
  <option value="freestanding">Freestanding</option>
  <option value="third_party">Third Party</option>
</select><br><br>

<input type="checkbox" id="parts-cb1" value="1">
<br>
<input type="checkbox" id="parts-cb2" value="1">
<br>
<input type="checkbox" id="parts-cb3" value="1">

答案 2 :(得分:1)

感谢@Ashraf,我无法使您的建议适应我的代码,但它确实让我走上了一条令人满意的结论的道路。我最后编写了一些接受枚举作为参数的函数。从我最初的方法来看,它有点偏离轨道,但它会勾选所有方框,例如:具有最小的代码重复,并且仍然是避免不必要的实例化的功能方法。最终代码在这里:

enum Direction: Int {
    case N
    case NE
    case E
    case SE
    case S
    case SW
    case W
    case NW
}
enum Action: Int {
    case Idle
    case Move
}
func spriteFramesDroid(direction:Direction, action:Action) -> String {

    switch action {
        case .Idle:
            switch direction {
                case .N:
                    return "droid_n"
                case .NE:
                    return "droid_ne"
                case .E:
                    return "droid_e"
                case .SE:
                    return "droid_se"
                case .S:
                    return "droid_s"
                case .SW:
                    return "droid_sw"
                case .W:
                    return "droid_w"
                case .NW:
                    return "droid_nw"
            }
        case .Move:
            switch direction {
                case .N:
                    return "droid_move_n"
                case .NE:
                    return "droid_move_ne"
                case .E:
                    return "droid_move_e"
                case .SE:
                    return "droid_move_se"
                case .S:
                    return "droid_move_s"
                case .SW:
                    return "droid_move_sw"
                case .W:
                    return "droid_move_w"
                case .NW:
                    return "droid_move_nw"
            }
    }

}

答案 3 :(得分:0)

我相信你可以特别利用这篇文章的枚举部分。它显示了与您的想法有点相关的东西。 http://www.objc.io/issue-16/power-of-swift.html

从上述网站引用

&#34;他们非常相似。如果更改案例的命名,则唯一不同的是关联值。如果您还为可选的Nil大小写添加了一个值,则最终得到Either类型:

enum Either<A,B> { case Left(A) case Right(B) }

当你想要在两件事之间做出选择时,Either类型在函数式编程中被大量使用。例如,如果您有返回整数或错误的函数,则可以使用Either。如果您想在字典中存储布尔值或字符串,可以使用Either作为键类型。

理论旁白:有时枚举是所谓的和类型,因为它们代表不同类型的总和。在Either的情况下,它们代表A和B的总和。结构或元组称为产品类型,因为它们代表不同类型的产品。另请参见:代数数据类型。&#34;