2015-02-10 33 views
2

我想要做這樣的事情...斯威夫特 - 類別枚舉(或大意的東西)

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很陌生。謝謝。

回答

0

我相信你可以利用這篇文章,特別是枚舉部分。它顯示了一些與你的想法有關的東西。 http://www.objc.io/issue-16/power-of-swift.html

從上述網站引用

「他們是非常相似的。如果你改變的情況下,命名,這是不同的唯一事情是相關聯的值,如果您還添加了一個值的零的情況下可選的,你最終得到的任一類型:

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

的任一類型的使用了很多,當你想表示兩件事情之間的選擇功能的編程舉例來說,如果你有函數,返回無論是整數還是錯誤,都可以使用Ei療法。如果您想要在字典中存儲布爾值或字符串,可以使用Either作爲鍵類型。

理論上拋開:有時枚舉是所謂的總和類型,因爲它們表示不同類型的總和。在任一情況下,它們表示A和B的總和。結構或元組稱爲產品類型,因爲它們表示不同類型的產品。另請參閱:代數數據類型「

+0

請看看http:// stackoverflow。com/help/how-to-answer:「**爲鏈接提供上下文**鼓勵鏈接到外部資源,但請在鏈接上添加上下文,以便您的同行用戶瞭解它是什麼以及它爲什麼在那裏。引用重要鏈接中最相關的部分,以防目標站點無法訪問或永久脫機。「 – 2015-02-10 09:55:31

+1

該鏈接很有趣,但沒有回答這個問題。我認爲Swift根本無法做到要求。 – 2015-02-10 10:02:07

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

} 
+0

您的解決方案比我想象的要好。做得好! :) – 2015-02-10 11:53:45

0

你可以爲該枚舉創建一個別名,它可以像子類一樣行動

ex蘋果的默認值:

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

}