Swift 数组中的 AnyType 错误

AnyType error in Swift array

尝试在 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)

"Cannot assign value of type [anyobject] to logic.card"("logic"是整体class的名字,Card是其中的另一个class)

有人知道怎么了吗?我猜这个数组不是 AnyObject 类型的数组,因为我声明它包含卡片,对吧?

问题是 arrayByShufflingObjectsInArray 需要一个 [AnyObject] 而 returns 需要一个 [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]
    }
}

(请随意为该方法起一个更吸引人的名字)

force downcast 被用作解决问题的一个丑陋的解决方案——这就是为什么我建议创建一个扩展,而不是直接使用它。它不会崩溃,因为输出数组保证包含与输入相同类型的对象(因为您传入的数组只能包含单一类型)。

您现在可以像这样使用它了:

cardDeck = GKRandomSource.sharedRandom().arrayOfSameTypeByShufflingObjectsInArray(cardDeck)