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

Best way to check for all values in a Int

我不知道是否有更好的方法,我的解决方案有效但似乎是重复的。

我有一个使用 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 个以上,则很难扩展。

有什么建议吗?

您似乎还有其他不想更改的代码。我会提出以下建议。

将您所有的 lifeIcon 加载到一个数组中,然后执行以下操作。 (根据您是否基于 0 进行调整)。

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

这个怎么样:

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

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

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

假设你想在减少生命值时将visible设置为false,你可以使用这样的东西:

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

...

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

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

lifeIcons.enumerate().forEach{.visible = [=11=] < lives}

(这里</code>是迭代中的当前生命图标,<code>[=15=]是那个图标的索引)

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

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