Ios 为一组卡片中的每个卡片实例赋值
我有一个名为Card的结构,我创建了一个函数,它应该创建一副卡片。我已经找到了一些关于创建卡片组的线索,但它们要么是在Objective-C中,要么是使用枚举分配等级和套装,我不想这么做 我有以下字符串数组:Ios 为一组卡片中的每个卡片实例赋值,ios,swift,struct,properties,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 n
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)
var name = ""
对于每张卡,name属性为空(或空白),我可以通过print()调用看到它
我尝试更改我的name属性,如下所示:
let myDeck = Card().createDeck(fibonacciSeries)
var name = ""
但它们仍然是空白的
我做了更多的研究,了解到如果我在初始值设定项中给属性赋值,我可以创建一个属性而不给它一个默认值,所以我添加了以下内容:
init(name: String) {
self.name = name
}
仍然没有乐趣,因为Xcode提醒我需要在Card()调用中为name传递一个值,当我这样做时,所有的卡都被命名为我传入的值
最后,我想将这些卡片放入UICollectionView并查看这些值,但我似乎陷入了一个带有此名称属性的圆圈中,无法退出
我在这里查看了几个线程,没有一个我能找到的线程提供了答案
非常感谢您的帮助。您正在创建新的
卡
实例并将它们添加到数组中,但您没有打印新卡的名称
,而是打印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
函数,而structs不能使用class函数,因此必须创建Card
的实例,以便调用createDeck
。您应该创建一个Card类,或者在面向对象的设计方面,更好的方法是创建一个Deck结构
struct Deck {
var cards:[Card]
init(_ series:[String]) {
self.cards = [Card]()
for value in series {
let newCard=Card(name: value)
self.cards.append(newCard)
print("The card name is \(newCard.name)")
}
}
}
let myDeck = Deck(fibonacciSeries)
print(myDeck)
您有几个问题,其中最大的问题是createDeck
函数不是声明为静态的,因此您只能在引用现有卡时调用它。正如paul指出的,当您调用print函数时,您是在您创建的虚拟实例上调用它,以便有一张卡可以使用。使createDeck成为静态解决方案,因为它现在不再需要卡来操作:
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) }
}
您的名称
属性实际上不应该为空,您的打印语句就是错误的。您正在打印调用该方法的卡
实例的名称,而不是在该方法中创建的实例。谢谢您,Paul。我在Card结构中创建了这个函数,因为这是Apple Swift编程指南示例的建议。这感觉不太正确,所以我很高兴你提出了这个建议。单独的甲板结构更有意义。