【发布时间】:2021-11-17 10:20:44
【问题描述】:
您好,我是 swift 新手,如果我遗漏了一些明显的东西,请多多包涵。
我有一个函数bestSum,它接受两个参数targetNumber 和numbers,这是一个数组。 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 个连续的打印语句中不同?我在这里想念什么。将不胜感激。
【问题讨论】:
-
你试过调试器吗?设置断点并单步执行代码,您可以看到发生了什么。
-
是的,我在操场和调试器上都进行了试验。在调试器中,我尝试使用
didset和willset为returningArray并且它永远不会在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