0

cardDeck と呼ばれる配列内の Card オブジェクトで構成される、Swift でカード デッキを作成してシャッフルしようとしています。それから私はそれをシャッフルしたい。関連コード:

    var cardDeck = [card]()

    for ind in 1 ... 4  
    {
        for ind2 in 1 ... 13
        {
            cardDeck.append(card(number: ind2, color: ind))
        }
    }

    cardDeck = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(cardDeck)

「[anyobject] 型の値を logic.card に割り当てられません」(「logic」は全体的なクラス名で、Card はその中の別のクラスです)

誰が何が悪いのか知っていますか?カードを含むと宣言したので、配列は AnyObject 型の配列ではないと思いますよね?

4

1 に答える 1

1

問題は、 をarrayByShufflingObjectsInArray受け取り、[AnyObject]を返すこと[AnyObject]です。

したがって、入力として提供する型情報を完全に破棄[Card]するため、出力を元の配列に割り当てようとすると、型を変換できないというエラーが発生します。これは、メソッドが Swift ではなく Objective-C で実装されているためだと思われます。

このメソッドのより Swifty なバージョンは次のようになります。

func arrayByShufflingObjectsInArray<T:AnyObject>(array:[T]) -> [T] {
    ...
}

ジェネリックを使用することで、最初に渡した型情報を保持し、入力したものと同じ型を返すことができます。実際、それを行うために独自の拡張機能を作成できますGKRandomSource

extension GKRandomSource {
    func arrayOfSameTypeByShufflingObjectsInArray<T:AnyObject>(array:[T]) -> [T] {
        return arrayByShufflingObjectsInArray(array) as! [T]
    }
}

(メソッドにもっとキャッチーな名前を付けてください)

フォース ダウンキャストは、この問題に対する醜い解決策として使用されます。そのため、これを直接使用するのではなく、拡張機能を作成することをお勧めします。出力配列には入力と同じ型のオブジェクトが含まれることが保証されているため、クラッシュすることはありません (渡す配列には単一の型しか含まれないため)。

次のように使用できるようになりました。

cardDeck = GKRandomSource.sharedRandom().arrayOfSameTypeByShufflingObjectsInArray(cardDeck)
于 2016-05-15T17:01:54.783 に答える