0

尝试在 Swift 中制作和洗牌卡片组,由名为 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 类型的数组,因为我将它声明为包含卡片,对吧?

4

1 回答 1

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)
于 2016-05-15T17:01:54.783 回答