【问题标题】:AnyType error in Swift arraySwift 数组中的 AnyType 错误
【发布时间】:2016-05-15 15:07:09
【问题描述】:

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

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

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

【问题讨论】:

  • card 是什么?结构还是类?尽管请注意类型名称应以大写字母开头,即Card
  • 它是一个类。哦,我没想到。这只是最佳实践还是与语法相关?
  • 错误到底发生在哪里?
  • 在洗牌线上
  • @OhDannyBoy 命名应该是无关的,这只是最佳实践。

标签: arrays swift shuffle gameplay-kit anyobject


【解决方案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)

【讨论】:

  • 谢谢你,解决了! :D 现在我也学会了如何在 Swift 中使用 Extensions,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2014-12-02
相关资源
最近更新 更多