我一直在尝试遍历一个数组来检查两个特定值出现的次数。我想出了这段代码:
var paymentNum = 0
var creditNum = 0
for index in images {
if images.objectAtIndex(index) == 0 {
paymentNum = paymentNum + 1
} else {
creditNum = creditNum + 1
}
}
这似乎不起作用。我刚收到错误' AnyObject'不可转换为' Int'。
我哪里错了?
答案 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。