我正在设计一个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数组中的列的位置?
答案 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
。