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)
Was ist 'card'? Eine Struktur oder eine Klasse? Beachten Sie, dass Typennamen mit einem Großbuchstaben beginnen sollten, z. B. "Karte". – Hamish
Es ist eine Klasse. Und darüber habe ich nicht nachgedacht. Ist das nur eine Best Practice oder Syntax relevant? – OhDannyBoy
Wo genau tritt der Fehler auf? – luk2302