Swift数组中的AnyType错误

时间:2016-05-15 15:07:09

标签: arrays swift shuffle gameplay-kit anyobject

尝试在Swift中制作和洗牌,由名为cardDeck的数组中的Card对象组成。然后我想洗牌。相关代码:

    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" ("逻辑"是整体的类名,而Card是其中的另一个类)

任何人都知道什么是错的?我猜这个数组不是AnyObject类型的数组,因为我声明它包含卡片,对吗?

1 个答案:

答案 0 :(得分: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)