【问题标题】:Assigning values to each instance of Card in a deck of cards为一副卡片中的每个卡片实例分配值
【发布时间】:2016-04-11 00:01:47
【问题描述】:

我有一个名为 Card 的结构,并且我创建了一个应该创建一副纸牌的函数。我在 SO 上找到了几个关于创建卡片组的线程,但它们要么在 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) 

每张卡片的 name 属性为空(或空白),我可以通过 print() 调用看到。

我尝试像这样更改我的 name 属性:

var name = ""

但它们仍然是空白的。

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

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

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

最终,我想将这些卡片放入 UICollectionView 并查看这些值,但我似乎被这个名称属性困在一个圈子里,我无法脱身。

我在这里查看了几个主题,但没有一个提供答案。

非常感谢任何帮助。

【问题讨论】:

  • 您的 name 属性实际上不应为空,您的打印语句是错误的。您正在打印您正在调用该方法的 Card 实例的名称,而不是您在该方法中创建的实例。

标签: ios swift struct properties


【解决方案1】:

您正在创建新的Card 实例并将它们添加到数组中,但您没有打印新的Cardname,而是打印selfname,这是你初始化它的空字符串。

如果您打印了 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 的实例,以便您可以调用createDeck。您应该创建一个 Card Class,或者在面向对象设计方面可能更好,创建一个 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)

【讨论】:

  • 谢谢你,保罗。我在 Card 结构中创建了该函数,因为这是 Apple Swift Programming Guide 示例建议的方式。感觉不太对,所以我很高兴你提出了这个建议。单独的 Deck 结构更有意义。
【解决方案2】:

您有几个问题,其中最大的问题是您的createDeck 函数没有声明为静态的,因此您只能在引用现有卡时调用它。当你调用你的 print 函数时,正如保罗指出的那样,你是在你创建的虚拟实例上调用它,以便你有一张 Card 可以使用。将 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)

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

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

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 2013-11-24
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多