检查Int中所有值的最佳方法

时间:2016-05-04 16:54:15

标签: swift if-statement control-flow

我不知道是否有更好的方法可以做到这一点,我的解决方案有效,但似乎重复。

我有一个生命指示器,使用SpriteBuilder中的图标表示,这些图标设置为不可见,然后在源代码中我实现了以下代码:

    lives = 3 // this is reduced or increased within game
    if (lives == 5) {
        lifeIcon1.visible = true
        lifeIcon2.visible = true
        lifeIcon3.visible = true
        lifeIcon4.visible = true
        lifeIcon5.visible = true
    } else if (lives == 4) {
        lifeIcon1.visible = true
        lifeIcon2.visible = true
        lifeIcon3.visible = true
        lifeIcon4.visible = true
    } else if (lives == 3) {
        lifeIcon1.visible = true
        lifeIcon2.visible = true
        lifeIcon3.visible = true
    } else if (lives == 2) {
        lifeIcon1.visible = true
        lifeIcon2.visible = true
    } else if (lives == 1) {
        lifeIcon1.visible = true
    }

这种方法很好,但看起来很重复,如果我想在以后将生命增加到5以上,很难扩展。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这个怎么样:

let icons = [lifeIcon1, lifeIcon2, lifeIcon3, lifeIcon4, lifeIcon5]

icons[0..<lives].forEach { $0.visible = true }

它类似于@Adam Heeg的回答,但是c风格的循环正在被弃用。我会按下标对数组进行切片,然后使用forEach

答案 1 :(得分:2)

假设您希望在减少生命时将visible设置为false,可以使用以下内容:

let lifeIcons = [lifeIcon1, lifeIcon2, lifeIcon3, lifeIcon4, lifeIcon5]

...

for (index, lifeIcon) in lifeIcons.enumerate() {
    lifeIcon.visible = index < lives
}

或者如果你喜欢使用闭包:

lifeIcons.enumerate().forEach{$1.visible = $0 < lives}

(此处$1是迭代中的当前生活图标,$0是该图标的索引)

这里的关键是使用数组而不是多个变量来跟踪你的生活图标。然后,您可以使用元素的索引遍历此数组,以确定它们是哪个图标。 enumerate()用于创建具有索引的元素对的延迟序列。

在这种情况下,我们可以将元素的指数与当前的生命数进行比较。因为索引是基于0的,我们可以检查给定的索引是否小于当前的生命数,以确定它是否应该可见。

答案 2 :(得分:0)

您似乎还有其他一些不会改变的代码。我建议如下。

将所有lifeIcon加载到数组中,然后执行以下操作。 (如果您是0,请调整。)

for (int i = 0; i < lives; i++)
{
   lifeIconArray[i].visible = true;
}