Ошибка 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)
Другие вопросы по тегам