Ошибка AnyType в массиве Swift
Попытка создать и перемешать колоду карт в Swift, состоящую из объектов Card в массиве с именем cardDeck. Тогда я хочу перемешать это. Соответствующий код:
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, так как я объявил его содержащим карточки, верно?
1 ответ
Проблема в том, что arrayByShufflingObjectsInArray
занимает [AnyObject]
и возвращает [AnyObject]
,
Поэтому он собирается полностью выбросить [Card]
введите информацию, которую вы предоставляете в качестве входных данных, и, таким образом, получаете ошибку о невозможности преобразования типов, когда вы пытаетесь присвоить выходные данные исходному массиву. Я подозреваю, что это происходит из-за метода, реализуемого в Objective-C, а не в Swift.
Более 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)