gpt4 book ai didi

arrays - Swift 数组中的 AnyType 错误

转载 作者:行者123 更新时间:2023-11-30 10:03:34 25 4
gpt4 key购买 nike

尝试在 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”(“logic”是整个类名,Card是其中的另一个类)

有人知道这是怎么回事吗?我猜该数组不是 AnyObject 类型的数组,因为我将其声明为包含卡片,对吧?

最佳答案

问题是 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)

关于arrays - Swift 数组中的 AnyType 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37239895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com