为一副牌中的每个卡实例分配值

时间:2016-04-11 00:01:47

标签: ios swift struct properties

我有一个名为Card的结构,我已经创建了一个应该创建一副牌的功能。我已经找到了关于创建卡片组的几个主题,但他们要么使用Objective-C,要么使用我不想尝试的枚举来分配等级和套装。

我有这个字符串数组:

let fibonacciSeries = ["0", "1", "2", "3", "5", "8", "13", "21", "34", "55", "89", "144", "∞"]

我希望我的createDeck函数使用这些值创建一副牌:

struct Card {

var name = String()

func createDeck(series: [String]) -> [Card] {
    var deck = [Card]()
    for value in series {
        deck.append(Card(name: value))
        print("The card name is \(self.name)")
        }
        return deck
    }
}

当我这样称呼时:

let myDeck = Card().createDeck(fibonacciSeries) 

每张卡的名称属性为空(或空白),我可以通过print()调用查看。

我尝试更改我的名字属性:

var name = ""

但他们仍然是空白。

我研究了一些,并了解到如果我在初始化程序中给它一个值,我可以创建一个属性而不给它一个默认值,所以我添加了这个:

init(name: String) {
  self.name = name
}

仍然没有喜悦,因为Xcode提醒我需要在Card()调用中传递name的值,当我这样做时,所有的卡都被命名为我传入的值。

最终,我想将这些卡放入UICollectionView并看到这些值,但我似乎陷入了一个带有这个名称属性的圈子,我无法退出。

我在这里查看了几个主题,但我找不到的任何主题都提供了答案。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您正在创建新的Card个实例并将其添加到数组中,但是您没有打印新name的{​​{1}},而是打印Card name,这是您初始化它的空字符串。

如果您在self返回的数组中打印了卡片的值,那么您会看到正确的值。

然而,对代码的简单修复是为新卡使用变量,以便您可以打印它。

createDeck

然而,这是对结构的轻微折磨。由于您希望拥有func createDeck(series: [String]) -> [Card] { var deck = [Card]() for value in series { let newCard=Card(name: value) deck.append(newCard) print("The card name is \(newCard.name)") } return deck } 函数并且结构不能具有类函数,因此您最终必须创建createDeck实例才能调用Card。您应该创建一个Card类,或者在面向对象设计方面更好,创建一个Deck结构。

createDeck

答案 1 :(得分:0)

您有几个问题,其中最大的问题是您的createDeck函数未声明为静态,因此您只能在引用现有卡时调用它。当你打电话给你的打印功能时,正如paul指出的那样,你在你创建的虚拟实例上调用它,这样你就可以使用一张卡片了。 make createDeck static解决了现在不再需要卡操作的问题:

struct Card {
    var name = String()

    static func createDeck(series: [String]) -> [Card] {
        var deck = [Card]()
        for value in series {
            deck.append(Card(name: value))
            print("The card name is \(self.name)")
        }
        return deck
    }
}

let fibonacciSeries = ["0", "1", "2", "3", "5", "8", "13", "21", "34", "55", "89", "144", "∞"]

let deck = Card.createDeck(fibonacciSeries)

print(deck[0].name)

而且,fwiw,您可以将createDeck简化为:

static func createDeck(series: [String]) -> [Card] {
    return series.map { Card(name: $0) }
}