是否有可能缩短大量不断检查布尔值的代码

时间:2017-03-16 11:18:05

标签: ios swift function struct uibutton

我的观点中有不同的UIButton。所有UIButtons都有一个标签,并有一个代表卡的图像。一些UIButton放在其他卡后面,可以解锁"如果已成功播放某张卡片。我正在检查后面的卡是否可以解锁的方式如下:

if card1.enabled == false && card2.enabled == false {

unlockCard3()

}
if card3.enabled == false && card4.enabled == false {

unlockCard5()

}
if card8.enabled == false && card5.enabled == false {

    unlockCard11()

    }

如果成功播放了任何一张牌,我就禁止他们使用以上功能。它确实有效,但它很多/重复代码。我很好奇是否有办法缩短这段代码。见图:enter image description here(左一)。在这张照片中,当成功播放10个黑桃时,应该解锁10个黑桃的右侧和顶部的卡片。只有当黑桃6成功解锁时,才能解锁10只黑桃的左卡。所有这些检查和长代码......必须有一种方法可以使这个过程更容易。谢谢你的每一个建议。

3 个答案:

答案 0 :(得分:2)

将您的按钮放在一个数组中,并使用第二个数组来表示卡片的关系:

let buttons = [button0, button1, button2, button3, button4, button5, button6, button7, button8, button9, button10, button11]

let relatives = [(1, 2, 3), (3, 4, 5), (5, 8, 11)]

for (card1, card2, card3) in relatives {
    if !buttons[card1].enabled && !buttons[card2].enabled {
        unlockCard(card3)
    }
}

答案 1 :(得分:1)

是的,您可以将所有卡和布尔变量放入一个数组中,然后使用循环迭代它们。比主要部分更像这样:

for (int i = 2; i < number_of_cards; i++)
{
   if (!cards[i - 2].enabled && !cards[i - 1].enabled)
     unlockCard(i);
}

您需要:

  • 使用数组来启动卡片
  • 可能使用的指数少于现在(即card3将成为牌[2])
  • 更改您的unlockCard方法以接受参数 - 卡片索引

答案 2 :(得分:1)

另一种方法是创建卡片对象,可以跟踪锁定的内容并在播放和解锁卡片时采取措施。例如:

class Card
{
    //MARK - Public
    func play() {
        if locks > 0 {return}//it's locked - cannot be played

        blockedCards.forEach({ (card) in
            card.locks -= 1
        })
        blockedCards = [Card]()

        //do anything else you need to (e.g. hide/move the button)
    }

    func blockCard(card: Card) {
        card.locks += 1
        blockedCards.append(card)
    }

    //MARK - Private
    private var blockedCards = [Card]()

    private var locks = 0 {
        didSet {
            if locks == 0 {
                //call your unlock function (e.g. flip the UIButton and show the card)
            }
        }
    }
}

您的UIButton可以在相关卡片的play方法上设置目标 - 只有在卡片解锁时,播放才能执行操作。

例如,让我们假设你有一张A级,B级,C级和D级的牌位,底部是D(B和C阻挡),顶部阻挡B:

    D
   / \
  B   C
 /
A

您可以按如下方式配置级别:

let cardA = Card()
let cardB = Card()
let cardC = Card()
let cardD = Card()

cardB.blockCard(card: cardD)
cardC.blockCard(card: cardD)
cardA.blockCard(card: cardB)

然后对象将在内部处理所有内容,例如:

cardB.play()//nothing happens (blocked by A)
cardD.play()//nothing happens (blocked by B and C)
cardA.play()//PLAYED - B unlocked
cardB.play()//PLAYED
cardD.play()//nothing happens (blocked by C)
cardC.play()//PLAYED - D unlocked
cardD.play()//PLAYED