为什么Swift在没有'?'的情况下创建可选参数

时间:2014-06-04 17:59:12

标签: swift xcode6

尝试实施"实验"在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 个答案:

答案 0 :(得分:5)

Enum的fromRaw()方法不知道你将传递给它的东西 - 它无法知道它是否会在每次调用时成功 - 所以他们设计的方法的返回类型为{{1 (返回类型是可选的)

Rank?运算符(称为forced unwrapping)强制将可选项转换为枚举(如果为!则会导致错误)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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