3

在尝试实现 Swift 编程指南第 35 页上的“实验”时,我在 Xcode 操场上遇到了一个非常奇怪的错误。在该方法中,在最内层循环pokerDeck开头的行中,我得到了错误。如何/为什么是可选的?let card...Value of optional type 'Rank?' not unwrappedRank

struct Card {
    var rank : Rank
    var suit : Suit
    init(rank : Rank, suit : Suit) {
        self.rank = rank
        self.suit = suit
    }
    func pokerDeck() -> Card[] {
        let suits = [Suit.Spades, Suit.Clubs, Suit.Hearts, Suit.Diamonds]
        var deck = Card[]()
        for suit in suits {
            for r in 1 ... 13 {
                let card = Card(rank: Rank.fromRaw(r), suit: suit) // ERROR
                deck += card
            }
        }
        return deck
    }
}

Xcode 建议的修复方法是添加一个!

let card = Card(rank: Rank.fromRaw(r)!, suit: suit)

这使得问题更加模糊。

4

4 回答 4

5

Enum的fromRaw()方法不知道你将传递给它什么——它不知道它是否会在每次调用中成功——所以他们设计了返回类型为的方法Rank?(返回类型是可选的)

运算符!(称为强制展开)强制将可选项转换为枚举(如果是,则会导致错误nil

于 2014-06-04T18:02:45.333 回答
2

您的问题是 fromRaw 返回一个可选值。如果您确定您传递的所有原始值都将具有枚举值,则建议的修复是正确的。

于 2014-06-04T18:02:11.227 回答
2

枚举的 fromRaw() 方法返回类型的可选项,因为不能保证每个原始值都有一个值。

于 2014-06-04T18:02:20.030 回答
1

在 swift 中,某些函数返回可选的包装类型。在这种情况下, fromRaw() 函数返回一个可选的包装枚举。

当您知道该类型将始终存在时,请使用感叹号 (!) 声明 var。这将自动解开可选项以根据需要使用,或者如果为 nil 则出现运行时错误。

于 2014-06-04T18:26:50.660 回答