gpt4 book ai didi

xcode - Swift 中的引用类型 - 对函数/闭包的引用

转载 作者:可可西里 更新时间:2023-11-01 01:06:23 25 4
gpt4 key购买 nike

我注意到在 Swift 中,当我创建一个带有返回值 returnValueoriginalFunction() 并创建一个新函数时 let referenceA = originalFunction() ,这将发生:

  1. 因为 referenceA 是对 originalFunction() 的引用,当我执行 let referenceB = referenceA 时,referenceBreferenceA 将共享returnValue
  2. 但是当我让referenceC = originalFunction()时,在这种情况下我想referenceCreferenceA 也应该共享 returnValue 因为它们都引用 originalFunction(),所以这是不正确的。

为什么?

例子:

func makeIncrementor(forIncrement amount:Int) -> () -> Int {    
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}

//then let's make referenceA

let incrementByTen = makeIncrementor(forIncrement:10)
incrementByTen()
//returns 10
incrementByTen()
//returns 20

//Now make referenceB
let incrementBy10 = incrementByTen
//referenceA and referenceB will share the *returnValue*:
incrementBy10()
//returns 30

//Now make referenceC
let incrementByTen10 = makeIncrementor(forIncrement:10)
//referenceA and referenceC do not share the *returnValue*
incrementByTen10()
//returns 10

最佳答案

您的 makeIncrementor 函数创建一个新的 () -> Int 增量函数,该函数捕获您在其上方创建的 runningTotal 变量。因为闭包是 reference types当您将 incrementByTen 闭包分配给新的 incrementBy10 闭包时,您实际上只是在分配一个引用,而这些 var 中的每一个都指向相同的闭包,因此调用其中任何一个都会增加闭包捕获的相同 runningTotal var

当您第二次调用 makeIncrementor 时,它会创建一个 闭包,用于捕获新的 runningTotal var ,因此它不会与您创建的第一个闭包共享相同的 runningTotal

你的 incrementor func 不是共享的,因为你在 makeIncrementor 中声明它,所以它只在调用的范围内有效makeIncrementor 并将在下次调用 makeIncrementor 时重新声明为新的 func。如果您希望每次调用 makeIncrementor 时共享它,您的 incrementor func 需要在 makeIncrementor .

关于xcode - Swift 中的引用类型 - 对函数/闭包的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com