【问题标题】:Swift - Subclass an Enum (or something to that effect)Swift - 子类化枚举(或类似的东西)
【发布时间】:2015-02-10 09:38:42
【问题描述】:

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

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"
        }
    }

}

...其中DroidSpriteFramesIdleDroidSpriteFramesMoveSpriteFrames 的子类,或者将其作为协议或类似的东西遵守。基本上,我希望有很多枚举,它们都具有相同的方向案例列表(N、NE、E 等),但对于这些常见方向有自己的唯一值列表。我不想使用类,因为这会导致在分配时创建实例。虽然对替代想法持开放态度,但我对 Swift 还是很陌生。谢谢。

【问题讨论】:

    标签: ios swift enums protocols subclass


    【解决方案1】:

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

    前苹果默认:

    public enum UITextFieldViewMode : Int {
    
        case Never
        case WhileEditing
        case UnlessEditing
        case Always
    }
    

    前别名:

    public typealias AutoCompleteButtonViewMode = UITextFieldViewMode
    

    你的功能:

    func showButtonWithViewMode(buttonViewMode: AutoCompleteButtonViewMode) {
    
        // Code here
    }
    

    用法:

    showButtonWithViewMode(.WhileEditing)
    

    【讨论】:

      【解决方案2】:

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

      enum Direction:String {     
          case N = "n"
          case NE = "ne"
          case E = "e"
          case SE = "se"
          case S = "s"
          case SW = "sw"
          case W = "w"
          case NW = "nw"
      }
      
      enum Action: String {
          case Idle = "droid"
          case Move = "droid_move"
      }
      
      func spriteFramesDroid(direction:Direction, action:Action) -> String {
          return "\(action.rawValue)_\(direction.rawValue)"
      
      }
      

      【讨论】:

        【解决方案3】:

        感谢@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"
                    }
            }
        
        }
        

        【讨论】:

        • 您的解决方案比我想象的要好。做得好! :)
        【解决方案4】:

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

        引自上述网站

        "它们非常相似。如果更改 case 的命名,唯一不同的是关联的值。如果您还在 optional 的 Nil case 中添加值,则最终会得到 Either 类型:

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

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

        抛开理论不谈:有时枚举是所谓的总和类型,因为它们代表不同类型的总和。在 Either 的情况下,它们表示 A 和 B 的总和。结构或元组被称为产品类型,因为它们表示不同类型的产品。另请参阅:代数数据类型。”

        【讨论】:

        • 请查看stackoverflow.com/help/how-to-answer:“为链接提供上下文 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户有一些了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。”
        • 链接很有趣,但没有回答问题。我认为 Swift 根本无法满足要求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多