【问题标题】:Code for checking data and storing data running twice in Swift在 Swift 中运行两次检查数据和存储数据的代码
【发布时间】:2017-01-26 11:52:16
【问题描述】:

我刚刚完成了一大段代码的编码,尽管它运行良好,但问题是每当我调用编写代码的方法时,代码都会运行两次。复制整个代码块可能没有用,因为它只会让您感到困惑,但我可以解释代码的结构。我怀疑问题出在方法的结构上。

func methodName {

    if thisConditionIsTrue {

        // This condition is true, so it gets executed: it retrieves an array of dictionaries from the database

        for-in loop {
            // This loop runs through all of the retrieved dictionary objects

            if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else {
                // True condition, so it gets executed: now it stores data form the client into the database

代码非常复杂,包含大量个人信息,所以很遗憾我不能在这里复制并发布,但我希望它的简化版本仍然可以让每个人都能理解它。我正在处理的问题是,只有代码的最后一部分(我假设,但不确定)被执行了两次,这意味着我想要存储在数据库中的任何内容都会被存储两次。我还在代码末尾发生了视图转换,它也被触发了两次,所以基本上每当调用此方法时,我都会看到视图转换在瞬间发生两次。我假设它只运行代码的最后一部分两次的原因是因为我假设它与 for-in 循环有关(发生在过程中途的某个地方)。我认为这是我可以检查从数据库检索的字典数组中的每个单独字典的唯一方法,但问题是用于将数据存储在数据库中的代码也写在 for-in 循环中。因此,每当循环决定再次运行(出于某种原因)时,它可能会再次执行真正的“else”语句,从而导致 else 语句中的每个代码都被执行两次。谁能纠正我或确认这确实是我的问题的原因?只有,如果是的话,我是否还可以获得一些关于在不使用 for-in 循环的情况下运行字典数组的最有效方法的提示?

【问题讨论】:

    标签: ios arrays swift loops dictionary


    【解决方案1】:

    您不需要在循环中使用 for,因为字典没有排序,这就是它的美。你唯一需要做的就是

    1.如果要检查字典中是否存在键

    if  dictionary[keyname] != nil {
       //perform some action
    }
    

    2.如果你想检查一个键的值是否等于你正在检查的某个变量

    if  dictionary[keyname] == variableYouAreCheckingAgainst {
       //perform some action
    }
    

    【讨论】:

    • 这怎么可能?我在一个数组中有多个字典,那么它如何知道需要检查哪个字典来检查“keyname”值?老实说,我不认为字典数组与任何其他数组(例如字符串数组)有任何不同。我有多个字典,它们都有 5 个键,但每个字典都有其他值分配给这 5 个键。
    • 对,你想给我一个简单的例子来说明数组和字典包含的内容吗?
    • 您可以搜索数组中的特定元素。例如 let array["x","y","z","w"] ; if array.contains("z"){ print("it contains the element") } 。除非必须,否则不要遍历数组,例如,我问你是否有更有效的方法。 .
    • 举个例子:数组可以包含 30 个字典,每个字典有 5 个键,数组中的每个字典都有相同的 5 个键:“名字”、“姓氏”、“日期出生”、“年龄”和“地址”。这基本上意味着这 5 个键在数组中出现了 30 次,并且 30 次中的每一次都包含不同的值。因此,如果我要根据您的示例中的变量来检查它,它会将 1 个变量与 30 个不同的值进行比较......这不是很方便,我很确定这甚至是不可能的。
    • 遍历 1 个字典真的很愚蠢,因为字典中的每个键值对都有不同的键,所以我可以单独检查每个键。但是当我有一个包含多个字典的数组时,我会多次遇到同一个键,这迫使我循环遍历数组以确保每次遇到一个键时,它都包含不同的值。
    【解决方案2】:

    是的,for-in 循环的整个代码块将被执行多次,对数组中的每个字典执行一次。如果有多个字典满足最终else 子句的相关条件,那么,是的,它将被执行多次。如果您有只需要执行一次的代码,如果任何字典符合相关条件,请设置一个标志并在 for-in 循环完成后对其进行测试:

    if thisConditionIsTrue {
    
        // This condition is true, so it gets executed: it retrieves an array of dictionaries from the database
        var oneOffProcessRequired = false
        for-in loop {
            // This loop runs through all of the retrieved dictionary objects
    
            if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else {
                // True condition, so it gets executed: set the flag
                oneOffProcessRequired = true
            }
        }
        if oneOffProcessRequired == true {
            // flag is true, so store data form the client into the database
        }
    

    或者,如果您想在其中一个字典满足最后一个 else 子句的条件时立即放弃 for-in 循环,只需使用 break 来终止循环。

    此外,通过抛出一些 print 语句和/或使用一些断点并逐步执行执行来尝试跟踪执行流程可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2014-07-23
      • 2020-12-12
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多