Swift学习 enum的遍历

来源:互联网 发布:visio 软件开发流程图 编辑:程序博客网 时间:2024/06/08 15:22

在Swift官方教程讲到枚举类型的时候,练习题是

EXPERIMENT
Add a method to Card that creates a full deck of cards, with one card of each combination of rank and suit.”
摘录来自: Apple Inc. “The Swift Programming Language”。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329


这就想到了是否可以对enum进行遍历,即通过一下方式

for suit in Suit {  // do something with suit}
发现这个方式还是不成功,,,,

最后在网上搜了一下,最下面这个页面中很多人在讨论这个问题,有些解决方案让人耳目一新,所以有空的可以去看看

http://stackoverflow.com/questions/24007461/how-to-enumerate-an-enum-with-string-type


这里我比较喜欢其中一种解决方案:

    func makeDeck() -> Card[] {      var deck: Card[] = []      var suits: Suit[] = [.Hearts, .Diamonds, .Clubs, .Spades]      for i in 1...13 {        for suit in suits {          deck += Card(rank: Rank.fromRaw(i)!, suit: suit)        }      }      return deck    }
感觉这个更符合逻辑,但是这里有个问题是,所以枚举的键值不连续怎么办?比如值是间断的,那这里的for循环就不能这么用的。
网上还有一种解决方案是:

enum ProductCategory : String {    case Washers = "washers", Dryers = "dryers", Toasters = "toasters"        static let allValues = [Washers, Dryers, Toasters]}  for category in ProductCategory.allValues{  //Do something}

这个方案得到了大部分人的青睐,鲁棒性较强,有较好的通用性。


下面我把我的playground的代码贴出来

enum Rank:Int{

   case Ace

   case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten

   case Jack, Queen, King

   func simpleDescription()->String{

       switch self{

       case .Ace:

               return "ace"

       case .Jack:

               return "jack"

       case .Queen:

               return "queen"

       case .King:

               return "king"

        default:returnString(self.toRaw())

        }

    }

    

    staticlet allValues = [Ace,Two, Three,Four, Five,Six, Seven,Eight, Nine,Ten, Jack, Queen, King]

    

}


enum Suit{

   case Spades, Hearts, Diamond, Clubs

   func simpleDescription() -> String{

       switch self{

       case .Spades:return"spades"

       case .Hearts:return"hearts"

       case .Diamond:return"diamond"

       case .Clubs:return"clubs"

        }

    }

    

   static let allValues = [Spades,Hearts, Diamond,Clubs]


}

struct Card{

   var rank:Rank

   var suit:Suit

    

   func simpleDescription() -> String{

        return"The \(rank.simpleDescription()) of\(suit.simpleDescription())"

    }

    

   func creatFullDeckOfCard() -> Card[]{

       var cards : Card[] = []

       var suits : Suit[] = [.Hearts, .Spades, .Diamond, .Clubs]

        

       for i in 1...13{

           for suit in suits{

                cards +=Card(rank: Rank.fromRaw(i)!, suit: suit)

            }

        }

       return cards

    }

    

}


for rankin Rank.allValues{

   for suit inSuit.allValues{

       var card : Card =Card(rank: rank, suit: suit)

        card.simpleDescription()

    }

}




好像的确是第二种方法好用~~~  收藏了










































                                             
0 0
原创粉丝点击