查询对象是否是数组成员的方法?

时间:2017-01-14 11:23:35

标签: ios arrays swift

我正在设计一个FreeCell纸牌游戏,我的卡片(模型)和卡片视图(视图)都在代表卡片列的数组中 - 然后整个纸板就是一列列:

//in the model: 
typealias Card = DeckBuilder.Card
typealias Column = [Card]
var board = [Column](repeating: [], count: 8)
//in the view controller:
var boardForView = [[PlayingCardView]](repeatElement([PlayingCardView](), count: 8))

当用户点击cardView时,我希望控制器获取所选的cardView列&行(其中列是电路板中的哪一列,行是列中的哪一张卡),然后在模型中的相应位置找到该卡。

我已经设置了自拍手势识别器,并从中提取了cardView:

    func selectCard(_ sender: UITapGestureRecognizer) {
    if let selectedCard = sender.view as? PlayingCardView {
        print("card selected: \(selectedCard.cardDescription?.string)")
    }
}

所以问题是:cardView的属性是否在列数组中,然后是该列的属性,该列是boardForView数组中的列的位置?

2 个答案:

答案 0 :(得分:0)

我明白了!我想到的一种方法是遍历电路板每一列中的每张卡片并检查它是否=我当前的卡片。似乎太笨重了。但后来我找到了array.index(of:element),我的一天就被保存了!我必须遍历电路板上的每一列,但它仍然更加优雅:

    func selectCard(_ sender: UITapGestureRecognizer) {
    if let currentCard = sender.view as? PlayingCardView {
        for column in 1...boardForView.count {
            if let row = boardForView[column - 1].index(of: currentCard) {
                print("card selected: \(currentCard.cardDescription!.string) in row \(row+1) of column \(column)")
                selectedCard = freeCellGame.board[column - 1][row]
                print("card selected from model: \(selectedCard!.description)")
            }
        }
    }
}

答案 1 :(得分:0)

由于它是一款棋盘游戏,你肯定有一套逻辑设置来规划棋盘。使逻辑在两个方面都有效。也就是说,在创建电路板时使用它来提供布局信息,并使用它来获取有关电路板的信息。

这样,当手势识别器触发时,获取分接点并让布局逻辑告诉您分接头来自卡的行和列。

现在,您可以使用这两个索引(行和列)直接从Card属性中获取board