struct - swift 如何在构造结构时使用枚举作为参数?

标签 struct enums swift

我正在做一个 Swift 编程书的实验,并坚持在结构本身内部构造一个结构。但是错误报告参数未包装。我如何将它的值作为参数?

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
    func FullDeck() -> Card[] {
        var deck: Card[]
        for i in 1...13
        {
            for j in 0...3
            {
                let rank_para = Rank.fromRaw(i)
                let suit_para = Suit.fromRaw(j)


                **deck.append(Card(rank: rank_para, suit : suit_para ))
                //value of optional type unwrapped;did you mean to use ? or !**

            }
        }
        return deck
    }
}




enum Rank: Int {
    case Ace = 1
    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:
            return String(self.toRaw())
        }
    }
    func compare(sec:Rank) -> Bool {
        var first = 0
        var second = 0
        if self.toRaw() == 1 {
            first = 1
        } else {
            first = self.toRaw()
        }
        if sec.toRaw() == 1 {
            second = 1
        } else {
            second = self.toRaw()
        }
        return first > second
    }
}


enum Suit: Int{
    case Spades = 0
    case Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}

最佳答案

fromRaw 方法返回一个可选值:Rank?Suit?。这意味着该值可能为零。您需要检查一下:

if let aRank = rank_para {
    if let aSuit = suit_para {
        deck.append(Card(rank: aRank, suit: aSuit))
    }
}

通过使用“if let”,您将可选值“展开”为不再可选(不能为 nil)的值(aRank 和 aSuit)。

另一种方法:

if rank_para and suit_para {
    deck.append(Card(rank: rank_para!, suit: suit_para!))
}

在这里,您要检查 rank_para 和 suit_para 是否为零。如果它们都不是,则调用追加并使用 ! 来“展开”可选值。 ! 表示如果值为 nil 则抛出运行时错误,否则,将此变量视为不能为 nil

关于struct - swift 如何在构造结构时使用枚举作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109431/

相关文章:

java - 为什么 switch case 语句无法使用 Enum 的属性?

ios - 4 个选项卡的选项卡栏 Controller 中的相同 View Controller 给出了错误的选定 tabcontroller 选定索引

ios - 遍历 plist 文件并将数据存储在数组或字典中

c - GCC 和 Visual Studio(32 位 Controller )中结构大小的差异

c - 取消引用结构指针数组

java - 枚举输出错误

java - Java 中这两个 Enum 有什么区别

json - Swift:将属性添加到被编码为 JSON 的结构

c++ - 是否可以使结构直接返回值?

swift - 速记闭包不起作用