我注意到在Swift中,当我使用返回值 returnValue 创建 originalFunction(),并创建一个新函数时,让referenceA = 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
答案 0 :(得分:3)
您的makeIncrementor
函数会创建一个新的() -> Int
递增函数,用于捕获您在其上方创建的runningTotal
变量。因为当您将incrementByTen
闭包分配给新的incrementBy10
闭包时,闭包是reference types,您实际上只是分配一个引用,并且这些var
中的每一个都指向相同的闭包,所以调用其中任何一个都会增加闭包捕获的runningTotal
var
。
当您再次拨打makeIncrementor
时,会创建一个新关闭,以捕获新的runningTotal
var
,因此它不会共享runningTotal
incrementor
{1}}使用您创建的第一个闭包。
您的func
makeIncrementor
未被共享,因为您在makeIncrementor
内声明了它,因此它仅对func
的调用范围有效并且将被重新声明在下次makeIncrementor
被调用时作为新的makeIncrementor
。如果您希望每次调用incrementor
时都要共享此内容,则需要在func
之外声明makeIncrementor
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
。
答案 1 :(得分:0)
如果我的理解是正确的,这是因为嵌套函数仅仅是创建闭包的语法糖,因此每次调用incrementor
时都会创建另一个makeIncrementor
实例。
上面的代码几乎与此相同。
func makeIncrementor(forIncrement amount:Int) -> () -> Int {
var runningTotal = 0
let incrementor = {
runningTotal += amount
return runningTotal
}
return incrementor
}