我的 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()
    }
}