2016-05-15 8 views
0

カードデッキをSwiftで作成しようとしましたが、CardDeckという配列のCardオブジェクトで構成されていました。それから私はそれをシャッフルしたい。関連コード:スウィフト配列のAnyTypeエラー

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) 

「logic.cardする[ANYOBJECT]型の値を割り当てることができません」(「ロジック」は、全体的なクラス名であり、カードはその中に別のクラスである)をいただきました!間違っ

誰もが知っています?私はカードを含むと宣言して以来、配列はAnyObject型の配列ではないと思いますか?

+0

'card'何ですか?構造体またはクラス?ただし、タイプ名は大文字で始まる必要があります。つまり、「カード」です。 – Hamish

+0

そのクラス。そして、ああ、私はそれについて考えなかった。これは単なるベストプラクティスか構文に関連していますか? – OhDannyBoy

+0

エラーはどこで発生しますか? – luk2302

答えて

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) 
+0

ありがとうございました! :Dそして今、私はスウィフトで拡張機能を使う方法を学びました:) – OhDannyBoy

関連する問題