我的For循环中的计数没有递增

时间:2015-06-18 18:44:10

标签: ios macos swift eventkit

运行我的代码时,我得到的是1号打印到控制台,而不是1,2,3,4,5 ......

为什么这种情况发生的一些帮助会很棒,我很难搞清楚。

我们的想法是循环查看日历名称,直到找到“旅行”日历。

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

    }
}

3 个答案:

答案 0 :(得分:2)

您的计数变量没有递增,因为它在循环内声明并在每次迭代开始时初始化为零值。为了使代码按预期工作,您必须将var count = 0移到for循环之外。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

ALXGTV的答案解释了为什么会出现这种意想不到的行为。

您的代码可以进行优化 - 而不是手动处理计数器变量,我建议使用enumerate函数,该函数在每次迭代时返回(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()
    }
}