Swift枚举被视为可选的?

时间:2015-08-13 16:24:50

标签: ios xcode swift optional

在'CardDeck'类的下面一行,看起来像这样

let card = CardSprite(value: i, withSuite: suit)

我收到错误:

Value of optional type 'Suit?' not unwrapped. Did you mean to use "!" or "?"

根据我对正在使用的构造的理解,我没想到会出现这个错误。有谁知道为什么在这个例子中枚举类型Suit被认为是可选的?我正在使用Xcode 7 beta 4。 注意:我可以按照XCode弹出的说明来解决此问题。我只是不明白为什么会这样。 XCode建议像这样显式展开

let card = CardSprite(value: i, withSuite: suit!)

由于 麦克

这是一些代码:

enum Suit: Int
{
    case None=0,
    Spade,
    Club,
    Hearts,
    Diamonds
}
class CardSprite : SKSpriteNode
{
    var m_value: Int
    var m_suite: Suit

    init(value:Int, withSuite suite: Suit)
    {
        m_value = value
        m_suite = suite
        super.init(texture:nil, color:UIColor.redColor(), size:CGSize(width:20, height:50))
    }

    required init?(coder aDecoder: NSCoder) {
        m_value = -1
        m_suite = Suit.None
        super.init(coder: aDecoder)
    }
}
class CardDeck
{
    var cards: [CardSprite]
    init ()
    {
        cards = [CardSprite]()
        for s in 1...4{
            let suit = Suit(rawValue:s)

            for i in 1...13{
                let card = CardSprite(value: i, withSuite: suit)
                cards.append(card)
            }
        }
    }
}

3 个答案:

答案 0 :(得分:4)

let suit = Suit(rawValue:s)是可选的。从原始值创建枚举始终返回可选项。但是,如果您看到无案例,则可以通过覆盖原始值初始值设定项来覆盖此行为。

enum Suit: Int
{
    case None=0,
    Spade,
    Club,
    Hearts,
    Diamonds

    init(rawValue: Int) {
        switch rawValue {
        case Suit.Spade.rawValue:
            self = Suit.Spade
        case Suit.Club.rawValue:
            self = Suit.Club
        case Suit.Hearts.rawValue:
            self = Suit.Hearts
        case Suit.Diamonds.rawValue:
            self = Suit.Diamonds
        default:
            self = Suit.None
        }
    }
}

答案 1 :(得分:2)

不要迭代nan("")从原始值创建SELECT Appeals.*, Users.Firstname, Users.LastName FROM (Users INNER JOIN Appeals ON Appeals.SubmittedByUserID = Users.UserID ) INNER JOIN AppealsCategories ON Appeals.CategoryID = AppealsCategories.CatID WHERE AppealsCategories.CatName = "CategoryA"; - 直接迭代1...4

像这样:

Suit

此外,转储Suits案例,因为没有for suit in [.Spades, .Clubs, .Hearts, .Diamonds] { ... } 。另外,检查您的复数 - 所有套装应为复数 - .None - > Suit

答案 2 :(得分:1)

我建议不要使用原始值。 尝试这样的事情:

enum Suit {
  case None
  case Spade(_:Int)
  case Club(_:Int)
  case Hearts(_:Int)
  case Diamonds(_:Int)
}

func trythis(suit: Suit) {
  switch (suit) {
  case .Club(let value):
    print("value \(value)")
  case .Hearts(let value):
    print("value \(value)")
  case .Spade(let value):
    print("value \(value)")
  case .Diamonds(let value):
      print("value \(value)")
  case .None:
    print("nothing to see here")
  }
}

你可以这样调用这个函数:

trythis(.Club(4))

您可以将这些附加到您的CardSprite,以此方式确定其颜色和价值。