【问题标题】:Looping through arrays and increasing counters in Swift在 Swift 中循环遍历数组并增加计数器
【发布时间】:2016-06-19 20:30:05
【问题描述】:

所以我试图遍历一个数组并根据数组中的索引增加两个计数器。数组中有布尔值,计数器用于所述布尔值。我的实现是错误的,所以我想弄清楚我的逻辑是错误的还是我的实现不正确。所以多一双眼睛会有所帮助

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)")

【问题讨论】:

  • 你得到什么错误?
  • XCode 告诉我二元运算符“==”存在问题。所以它似乎不喜欢我的“if index == false”声明

标签: ios arrays swift for-in-loop


【解决方案1】:

就像Unheilig 写的 enumerate 正在返回一个序列类型。

您还可以删除 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 并将鼠标悬停在方法上,然后会出现问号,您可以单击该方法。将打开一个窗口,其中包含该方法的描述,有时还会打开一个示例,例如 enumerate()。请看下面的截图:

编辑 2:改进的解决方案

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

所以在你的情况下,$0 代表从索引 0 开始的每个元素。

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

对于falseCounter,您可以轻松地从boolArray.count 中减去trueCounter 的结果,即falseCounter = 4 - 3 -> 1

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

【讨论】:

  • 我认为您的方法是我将尝试使用的方法。我想了解有关枚举的更多详细信息,对于像我这样的新手来说,这是一种更简单的方法。
  • @rowenarrow 太好了,我也可以帮助你。我用快速帮助文档的提示编辑了我的答案。我认为您是初学者,它将在以后的问题中对您有很大帮助
  • 仅供参考@rowenarrow,我添加了一个改进的解决方案
【解决方案2】:

代码无法编译,因为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

【讨论】:

  • 这很好用,我需要花额外的时间来学习枚举。我刚刚学到了足够的知识,知道这是我如何访问数组的索引。
【解决方案3】:

试试这个:

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)")

【讨论】:

  • “if index”正在抛出一个标志,但这确实提醒我可以使用 += 1
  • 你有什么版本的 Xcode?我在这里工作得很好。你看到了吗,我删除了.enumerate()
  • 7.2.1 现在它似乎正在工作。我也喜欢你的方式,但已经接受了答案。在您的方法中,numTrue == true 如何。我似乎无法弄清楚这种关系?
  • if index {if index == true { 相同。我翻转了案例以使其更具可读性。
【解决方案4】:

只是为了添加一些更快速的香料,这里有一种不同的方法。

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

虽然它确实具有不同的运行时特性(即在过滤操作上创建一个新数组) - 所以我不会无条件推荐它。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多