遍历数组并增加 Swift 中的计数器
Looping through arrays and increasing counters in Swift
所以我试图遍历一个数组并根据数组中的索引增加两个计数器。该数组中有布尔值,计数器用于所述布尔值。我的实现充满了错误,所以我想弄清楚是我的逻辑不正确还是我的实现不正确。所以多一双眼睛会有所帮助
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)")
代码无法编译,因为 enumerate
以 (n, x)
.
形式返回 SequenceType
将您的代码更改为以下内容:
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++
}
}
输出:
Count true: 3
Count false: 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)")
就像 Unheilig 写的 enumarate 正在返回一个 sequenceType。
您还可以删除 enumerate 调用,我认为这会使您的代码更具可读性,如下所示:
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 并将鼠标悬停在该方法上,然后出现一个问号,您可以单击该方法。 window 将打开一个方法的描述,有时还有一个例子,比如 enumerate() 的例子。请参阅下面的屏幕截图:
编辑 2:改进的解决方案
Swift 在您的案例中为集合提供方法,以减少代码量。
在您的情况下,您可以使用方法 filter() which returns 一个新数组,方法是从调用它的数组中过滤掉元素。唯一的参数是一个闭包(阅读更多关于闭包 here),returns 一个布尔值,它将为数组中的每个元素执行一次这个闭包。
Swift 自动为内联闭包提供 shorthand 参数名称,可用于通过名称 [=12=], ,
等(来自文档)来引用闭包参数的值。
所以在你的情况下 [=13=]
代表从索引 0 开始的每个元素。
count
returns 数组中元素的数量,因此在您的情况下使用 filter
它仅 returns 3 因为 true 出现了 3 次。 trueCounter = 3
对于 falseCounter
,您可以轻松地从 boolArray.count
中减去 trueCounter 的结果,即 falseCounter = 4 - 3 -> 1
var boolArray = [true, true, false, true]
let trueCounter = boolArray.filter({[=11=] == true}).count
let falseCounter = boolArray.count - trueCounter
print("Count true: \(trueCounter)") // Count true: 3
print("Count false: \(falseCounter)") // Count false: 1
只是为了添加一些更快速的香料,这是一种不同的方法。
numTrue = boolArray.filter{ [=10=] }.count
numFalse = boolArray.count - numTrue
虽然它确实有不同的运行时特性(即在过滤器操作上创建一个新数组)——所以我不会无条件地推荐它。
所以我试图遍历一个数组并根据数组中的索引增加两个计数器。该数组中有布尔值,计数器用于所述布尔值。我的实现充满了错误,所以我想弄清楚是我的逻辑不正确还是我的实现不正确。所以多一双眼睛会有所帮助
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)")
代码无法编译,因为 enumerate
以 (n, x)
.
SequenceType
将您的代码更改为以下内容:
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++
}
}
输出:
Count true: 3
Count false: 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)")
就像 Unheilig 写的 enumarate 正在返回一个 sequenceType。
您还可以删除 enumerate 调用,我认为这会使您的代码更具可读性,如下所示:
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 并将鼠标悬停在该方法上,然后出现一个问号,您可以单击该方法。 window 将打开一个方法的描述,有时还有一个例子,比如 enumerate() 的例子。请参阅下面的屏幕截图:
编辑 2:改进的解决方案
Swift 在您的案例中为集合提供方法,以减少代码量。
在您的情况下,您可以使用方法 filter() which returns 一个新数组,方法是从调用它的数组中过滤掉元素。唯一的参数是一个闭包(阅读更多关于闭包 here),returns 一个布尔值,它将为数组中的每个元素执行一次这个闭包。
Swift 自动为内联闭包提供 shorthand 参数名称,可用于通过名称 [=12=], ,
等(来自文档)来引用闭包参数的值。
所以在你的情况下 [=13=]
代表从索引 0 开始的每个元素。
count
returns 数组中元素的数量,因此在您的情况下使用 filter
它仅 returns 3 因为 true 出现了 3 次。 trueCounter = 3
对于 falseCounter
,您可以轻松地从 boolArray.count
中减去 trueCounter 的结果,即 falseCounter = 4 - 3 -> 1
var boolArray = [true, true, false, true]
let trueCounter = boolArray.filter({[=11=] == true}).count
let falseCounter = boolArray.count - trueCounter
print("Count true: \(trueCounter)") // Count true: 3
print("Count false: \(falseCounter)") // Count false: 1
只是为了添加一些更快速的香料,这是一种不同的方法。
numTrue = boolArray.filter{ [=10=] }.count
numFalse = boolArray.count - numTrue
虽然它确实有不同的运行时特性(即在过滤器操作上创建一个新数组)——所以我不会无条件地推荐它。