【问题标题】:Variable not retaining its value变量不保留其值
【发布时间】:2021-11-17 10:20:44
【问题描述】:

您好,我是 swift 新手,如果我遗漏了一些明显的东西,请多多包涵。

我有一个函数bestSum,它接受两个参数targetNumbernumbers,这是一个数组。 bestSum 函数返回一个数组,其中包含来自numbers 的元素,可以添加这些元素以获得targetNumber。返回的数组也是加起来形成 targetNumber 的最短数字组合。如果没有任何数字组合可以加起来 targetNumber,则函数 bestSum 返回 nil。

    var bestSumMemoryDictionary : [Int : [Int]?] = [:]

    print(bestSum(targetNumber: 4, numbers: [2,4], memoryDictionary: &bestSumMemoryDictionary))



 func bestSum(targetNumber : Int , numbers : [Int] , memoryDictionary : inout [Int : [Int]? ] ) -> [Int]? {
    
    if let value = memoryDictionary[targetNumber]{
        return value
    }
    
    if targetNumber == 0 {
        return []
    }
    
    if targetNumber < 0 {
        return nil
    }
    
    var returningArray : [Int]? = nil
    
    for number in numbers {
        
        let remainder = targetNumber - number
        
        if var bestSumValueArray =  bestSum(targetNumber: remainder, numbers: numbers, memoryDictionary: &memoryDictionary){
            
            bestSumValueArray.append(number)
            
            guard var returningArray = returningArray else {
                returningArray = bestSumValueArray
                continue
            }
       
            if bestSumValueArray.count < returningArray.count{
                returningArray = bestSumValueArray
            }
            print(returningArray)
        }
        print(returningArray)
        
    }
    
    memoryDictionary[targetNumber] = returningArray
    return returningArray
}

返回的数组是 Optional([2, 2]) 以生成 4 的总和,其中预期和正确的值是 Optional([4])

问题发生在包含 returningArray = bestSumValueArray 的行中。该行下方的打印语句正在打印 [4] ,而下一个打印语句打印 Optional([2, 2]) 。为什么returningArray 的值在 2 个连续的打印语句中不同?我在这里想念什么。将不胜感激。

【问题讨论】:

  • 你试过调试器吗?设置断点并单步执行代码,您可以看到发生了什么。
  • 是的,我在操场和调试器上都进行了试验。在调试器中,我尝试使用 didsetwillsetreturningArray 并且它永远不会在 returningArray = bestSumValueArray 时被调用。无法得出可靠的结论
  • 调试器跟 didSet 和 willSet 有什么关系?使用调试器,在循环顶部设置断点并单步执行代码。您可以在 print 语句中查看每个变量的值,并查看改变它们的每个步骤。
  • 您可以尝试将guard 替换为if returningArray == nil { returningArray = bestSumValueArray }
  • hint this guard var returningArray 创建一个名为 returningArray 的变量,而不是在 for 循环外声明的 returningArray。试试把它改成guard var notReturningArray = returningArray,你就会明白我的意思了

标签: ios swift dictionary


【解决方案1】:

在您的代码中,您定义了 2 个具有相同名称的变量:

var returningArray : [Int]? = nil // 1st definition

for number in numbers {
    
    let remainder = targetNumber - number
    
    if var bestSumValueArray =  bestSum(targetNumber: remainder, numbers: numbers, memoryDictionary: &memoryDictionary){
        
        bestSumValueArray.append(number)
        
        guard var returningArray = returningArray else {
            returningArray = bestSumValueArray
            continue
        } // 2nd definition
   
        if bestSumValueArray.count < returningArray.count{
            returningArray = bestSumValueArray
        }
        print(returningArray) // 2nd variable
    }
    print(returningArray) // 1st variable
    
}

【讨论】: