检查 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 开始的,所以我们可以检查给定的索引是否小于当前的生命数,以确定它是否应该可见。
我不知道是否有更好的方法,我的解决方案有效但似乎是重复的。
我有一个使用 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 开始的,所以我们可以检查给定的索引是否小于当前的生命数,以确定它是否应该可见。