2016-05-15 12 views
0

Der Versuch, ein Karten-Deck in Swift zu erstellen und zu mischen, bestehend aus Card-Objekten in einem Array namens cardDeck. Dann möchte ich es mischen. Relevante Code:AnyType-Fehler im Swift-Array

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) 

"Can not Wert vom Typ zuordnen [ANYOBJECT] logic.card" ("Logik" ist die allgemeine Klassennamen und Card ist eine andere Klasse in ihm)

Wer weiß, was ist falsch ? Ich nehme an, dass das Array kein AnyObject-Array ist, da ich es so deklariert habe, dass es Karten enthält, richtig?

+0

Was ist 'card'? Eine Struktur oder eine Klasse? Beachten Sie, dass Typennamen mit einem Großbuchstaben beginnen sollten, z. B. "Karte". – Hamish

+0

Es ist eine Klasse. Und darüber habe ich nicht nachgedacht. Ist das nur eine Best Practice oder Syntax relevant? – OhDannyBoy

+0

Wo genau tritt der Fehler auf? – luk2302

Antwort

1

Das Problem ist, dass arrayByShufflingObjectsInArray eine [AnyObject] dauert und eine [AnyObject] zurückgibt.

Daher wird es Ihre [Card] Art von Informationen, die Sie als Eingabe bereitstellen, wegwerfen und Ihnen somit einen Fehler geben, wenn es nicht möglich ist, Typen zu konvertieren, wenn Sie versuchen, die Ausgabe wieder Ihrem ursprünglichen Array zuzuordnen. Ich vermute, dass dies auf die in Objective-C implementierte Methode zurückzuführen ist, nicht auf Swift.

Eine Swifty Version des Verfahrens würde wie folgt aussehen:

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

Durch die Verwendung von Generika, können Sie die Typinformationen erhalten, die Sie mit zu beginnen, passieren, die gleiche Art Rückkehr, die Sie eingegeben. In der Tat können Sie Ihre eigene Erweiterung von GKRandomSource, um genau das zu tun schreiben:

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

(Fühlen Sie sich frei mit einem eingängigen Namen für die Methode zu kommen)

Die Kraft niedergeschlagenes ist als eine hässliche Lösung für das Problem verwendet - weshalb ich empfehle, eine Erweiterung zu erstellen, anstatt diese direkt zu verwenden. Es kann nicht abstürzen, da das Ausgabe-Array garantiert Objekte des gleichen Typs wie die Eingabe enthält (da das übergebene Array nur einen einzigen Typ enthalten kann).

Sie können es jetzt wie so verwenden:

cardDeck = GKRandomSource.sharedRandom().arrayOfSameTypeByShufflingObjectsInArray(cardDeck) 
+0

Danke, das hat es behoben! : D Und jetzt habe ich gelernt, wie man Extensions in Swift benutzt, thx :) – OhDannyBoy