我的 For 循环中的计数没有递增
The count in my For loop is not incrementing
当 运行 我的代码时,我在控制台上打印了一些 1 而不是 1,2,3,4,5....
最好能帮我解释一下为什么会这样,我很难弄明白。
想法是遍历日历名称,直到找到 'Travel' 日历。
func checkCalendarExists(){
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
for i in eventCalendars {
var count = 0
var calendarCount = eventCalendars.count
if i.title != "Travel" && count != calendarCount
{
++count
println(count)
}
else if i.title == "Travel"
{
// do something
}
else
{
aMethod()
}
}
}
您的计数变量没有递增,因为它是在循环内声明的,并在每次迭代开始时初始化为值零。为了使您的代码按预期工作,您必须将 var count = 0
移到 for 循环之外。
您的 count
变量确实增加了,但每次 for loop
运行其序列时它都会重置为零。
始终建议在循环外声明和分配递增变量。
请将您的代码更改为(我正在循环之前初始化 var count = 0
)
func checkCalendarExists(){
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
var count = 0
for i in eventCalendars {
var calendarCount = eventCalendars.count
......
......
......
else
{
aMethod()
}
}
}
ALXGTV 的回答解释了您出现这种意外行为的原因。
虽然您的代码可以优化 - 而不是手动处理计数器变量,我建议使用 enumerate
函数,在每次迭代时 returns 一个 (index, value)
:
for (index, calendar) in enumerate(eventCalendars) {
...
}
还有这个变量:
var calendarCount = eventCalendars.count
在每次迭代时填充,始终具有相同的值。如果在循环之前移动它会更有效率,使其不可变:
let calendarCount = eventCalendars.count
for (index, calendar) in enumerate(eventCalendars) {
...
}
最后,我更愿意为 not found 条件使用一个标志,在循环外处理它:
func checkCalendarExists() {
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
var found = false
let calendarCount = eventCalendars.count
for (index, calendar) in enumerate(eventCalendars) {
if calendar.title == "Travel" {
// do something
found = true
break // This stops the loop
} else {
println(index + 1)
}
}
if !found {
aMethod()
}
}
当 运行 我的代码时,我在控制台上打印了一些 1 而不是 1,2,3,4,5....
最好能帮我解释一下为什么会这样,我很难弄明白。
想法是遍历日历名称,直到找到 'Travel' 日历。
func checkCalendarExists(){
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
for i in eventCalendars {
var count = 0
var calendarCount = eventCalendars.count
if i.title != "Travel" && count != calendarCount
{
++count
println(count)
}
else if i.title == "Travel"
{
// do something
}
else
{
aMethod()
}
}
}
您的计数变量没有递增,因为它是在循环内声明的,并在每次迭代开始时初始化为值零。为了使您的代码按预期工作,您必须将 var count = 0
移到 for 循环之外。
您的 count
变量确实增加了,但每次 for loop
运行其序列时它都会重置为零。
始终建议在循环外声明和分配递增变量。
请将您的代码更改为(我正在循环之前初始化 var count = 0
)
func checkCalendarExists(){
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
var count = 0
for i in eventCalendars {
var calendarCount = eventCalendars.count
......
......
......
else
{
aMethod()
}
}
}
ALXGTV 的回答解释了您出现这种意外行为的原因。
虽然您的代码可以优化 - 而不是手动处理计数器变量,我建议使用 enumerate
函数,在每次迭代时 returns 一个 (index, value)
:
for (index, calendar) in enumerate(eventCalendars) {
...
}
还有这个变量:
var calendarCount = eventCalendars.count
在每次迭代时填充,始终具有相同的值。如果在循环之前移动它会更有效率,使其不可变:
let calendarCount = eventCalendars.count
for (index, calendar) in enumerate(eventCalendars) {
...
}
最后,我更愿意为 not found 条件使用一个标志,在循环外处理它:
func checkCalendarExists() {
var eventCalendars = store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]
var found = false
let calendarCount = eventCalendars.count
for (index, calendar) in enumerate(eventCalendars) {
if calendar.title == "Travel" {
// do something
found = true
break // This stops the loop
} else {
println(index + 1)
}
}
if !found {
aMethod()
}
}