在Swift

时间:2016-03-06 07:27:23

标签: ios arrays swift for-in-loop

所以我试图循环一个数组并根据数组中的索引增加两个计数器。数组中包含布尔值,计数器用于所述布尔值。我的实现是错误填充的,所以我试图弄清楚我的逻辑是不正确的还是我的实现是不正确的。所以额外的一双眼睛会帮助

var numTrue = 0
var numFalse = 0
var boolArray = [true, true, false, true]

for index in boolArray.enumerate() {
  if index == false{
    numFalse++
  } else {
    numTrue++
  }
}

print("Count true: \(numTrue)")
print("Count false: \(numFalse)")

4 个答案:

答案 0 :(得分:3)

Unheilig写的enumarate正在返回sequenceType。

您还可以删除枚举调用,我认为这样可以使您的案例中的代码更具可读性:

var numTrue = 0
var numFalse = 0
var boolArray = [true, true, false, true]

for index in boolArray {
    if index == false{
        numFalse++
    } else {
        numTrue++
    }
}

print("Count true: \(numTrue)")
print("Count false: \(numFalse)")

修改1:快速帮助文档

下一次如果您遇到类似的问题或错误弹出,您也可以使用快速帮助文档,方法是按住alt并将鼠标悬停在方法上,而不是出现问号,您可以单击该方法。将打开一个窗口,其中包含该方法的描述,有时还会出现类似于enumerate()的示例。请参见下面的屏幕截图:

enter image description here

编辑2:改进的解决方案

Swift在您的情况下为集合提供方法,以减少代码量。 在您的情况下,您可以使用方法filter(),它通过过滤掉调用它的数组中的元素来返回一个新数组。唯一的参数是一个闭包(更多关于闭包here),它返回一个布尔值,它将为数组中的每个元素执行一次这个闭包。 Swift自动为内联闭包提供简写参数名称,可用于通过名称$0, $1, $2等来引用闭包参数的值(来自文档)。

因此,在您的情况下,$0代表从索引0开始的每个元素。

count返回数组中元素的数量,因此在您的情况下,使用filter它只返回3,因为true出现3次。 trueCounter = 3

对于falseCounter,您可以轻松地从boolArray.count falseCounter = 4 - 3 -> 1

中减去trueCounter的结果
var boolArray = [true, true, false, true]

let trueCounter = boolArray.filter({$0 == true}).count
let falseCounter = boolArray.count - trueCounter

print("Count true: \(trueCounter)") // Count true: 3
print("Count false: \(falseCounter)") // Count false: 1

答案 1 :(得分:2)

代码无法编译,因为enumerate正在以[{1}}格式向您返回SequenceType

将您的代码更改为以下内容:

(n, x)

输出:

var numTrue = 0
var numFalse = 0
let boolArray = [true, true, false, true]

//We are interested in value, ignoring the index
for (_, value) in boolArray.enumerate()
{
    if value == false
    {
        numFalse++
    }
    else
    {
        numTrue++
    }
} 

答案 2 :(得分:1)

试试这个:

var numTrue = 0
var numFalse = 0
let boolArray = [true, true, false, true]

for index in boolArray {
    if index {
        numTrue += 1
    } else {
        numFalse += 1
    }
}

print("Count true: \(numTrue)")
print("Count false: \(numFalse)")

答案 3 :(得分:1)

只是为了添加一些更好的香料,这里采用了不同的方法。

numTrue = boolArray.filter{ $0 }.count
numFalse = boolArray.count - numTrue

它确实具有不同的运行时特性(即在过滤器操作上创建一个新数组) - 所以我不建议无条件地使用它。