尝试在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类型的数组,因为我声明它包含卡片,对吗?
答案 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)