我有一个名为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并看到这些值,但我似乎陷入了一个带有这个名称属性的圈子,我无法退出。
我在这里查看了几个主题,但我找不到的任何主题都提供了答案。
非常感谢任何帮助。
答案 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) }
}