【问题标题】:Is it possible to shorten a lot of code which constantly checks for booleans是否可以缩短大量不断检查布尔值的代码
【发布时间】:2017-03-16 11:18:05
【问题描述】:

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

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

unlockCard3()

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

unlockCard5()

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

    unlockCard11()

    }

如果任何卡被成功打出,我将禁用它们以使上述功能正常工作。它确实有效,但是代码很多/重复。我很好奇是否有办法缩短此代码。见这张图片:(左一)。在这张图片中,黑桃 10 右侧和顶部的牌应该在成功打出黑桃 10 时解锁。只有当黑桃 6 成功解锁时,黑桃 10 的左侧牌才能解锁。所有这些检查和长代码......必须有一种方法可以使这个过程更容易。感谢您的每一个建议。

【问题讨论】:

  • 拳头请不要使用 == false 或 == true,!card1.enabled 看起来好多了

标签: ios swift function struct uibutton


【解决方案1】:

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

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)
    }
}

【讨论】:

  • 如果我早点知道这种方法,这将节省我输入所有这些 if 语句的时间:')。谢谢!!
【解决方案2】:

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

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

您需要:

  • 使用数组初始化卡片
  • 可能比现在少使用一个索引(即 card3 将成为卡 [2])
  • 更改您的 unlockCard 方法以接受参数 - 卡片索引

【讨论】:

  • 是的,如果所有卡都可以以某种方式解锁,这将起作用,但我的有点复杂。我更新了信息。
【解决方案3】:

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

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 方法上设置目标 - 只有在卡片解锁时才会执行操作。

例如,假设您有一个包含 4 张牌 A、B、C 和 D 的关卡,其中 D 在底部(被 B 和 C 阻挡),A 在顶部阻挡 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

【讨论】:

    猜你喜欢
    • 2022-09-26
    • 2020-08-29
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2013-04-02
    • 2012-10-29
    • 2019-11-06
    • 2017-10-10
    相关资源
    最近更新 更多