迭代数组以查找值的出现

时间:2014-10-05 04:08:01

标签: arrays for-loop swift nsarray

我一直在尝试遍历一个数组来检查两个特定值出现的次数。我想出了这段代码:

    var paymentNum = 0
    var creditNum = 0
    for index in images {
        if images.objectAtIndex(index) == 0 {
            paymentNum = paymentNum + 1
        } else {
            creditNum = creditNum + 1
        }
        }

这似乎不起作用。我刚收到错误' AnyObject'不可转换为' Int'。

我哪里错了?

3 个答案:

答案 0 :(得分:2)

我做了一些相当大的假设,因为你没有详细了解发生了什么。 我假设图像是NSArray。 Objective-C中的NSArray在swift中转换为[AnyObject]。 当你有像这样的for-each样式循环时

for value in array
{}

循环将遍历数组中的每个值。值是数组中的实际对象,而不是for(int i = 0; i < 10; i++)样式循环中的计数器

所以你可能真正期待的是

for item in images {
    if item == 0 {
        paymentNum++
    } else {
        creditNum++
    }
}

你也可能需要将循环从[AnyObject]转换为[Int]这样

let tmp = images as [Int]
for item in tmp
{...}

或者,像这样把数据拉出数组

for item in images {
    if (item as Int) == 0 {
        paymentNum++
    } else {
        creditNum++
    }
}

但前者可能更可取

答案 1 :(得分:1)

粘贴在游乐场:

import Foundation

let images = [1, 0, 1, 1, 0, 0, 1, 0, 1, 1]
var paymentNum = 0
var creditNum = 0
for item in images {
    println(item)
    if item == 0 {
        paymentNum = paymentNum + 1

    } else {
        creditNum = creditNum + 1
    }
}

println(paymentNum) //4
println(creditNum) //6

答案 2 :(得分:1)

只需2行代码即可实现更紧凑的方式。 它假设一个数组元素如果它的值为1就是一个功劳,否则就是0。

也就是说,如果你总结数组的所有元素,你就可以得到学分数 - 支付数是数组大小减去学分数。

要对数组的所有元素求和,最简单的方法是使用reduce方法(更多信息here

var creditNum = images.reduce(0, combine: { $0 + $1 } )
var paymentNum = images.count - creditNum

如果使用不同于0或1的值来识别信用和付款,则可以修改计算以检查显式值,如下所示:

var creditNum = images.reduce(0, combine: { $0 + ($1 == 1 ? 1 : 0) } )

这里需要先前的计数($ 0)并添加1或0,具体取决于元素数组($ 1)是否等于1。