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?(戻り値の型はオプションです)

!演算子 (強制アンラップと呼ばれる)は、optional を強制的に Enum に変換します (そうである場合はエラーが発生します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 に答える