当Swift中的函数被赋值给变量或作为嵌套函数从高级函数返回时,它是通过值还是通过引用传递的?我写的时候:
func foo() -> Bool
{
return false
}
var funcVar = foo
funcVar
会foo()
收到对foo()
的引用,或者是func otherfoo() -> (Int) -> ()
{
func bar(num :Int) {}
return bar
}
var funcVar = otherfoo()
的副本,并使用" funcVar"创建并存储在内存中名称?以下代码的相同问题:
funcVar(3)
第二个例子特别让我感到困惑,因为如果我打电话给bar
我就无法访问bar
,因为函数是通过引用分配/返回的,因为funcVar
是在public function kitchens()
{
return $this->belongsToMany('App\Kitchen')->withTimestamps();
}
相同范围内的另一个函数内部,但它仍然有效(来自C ++背景我很惊讶它编译)。
有人可以帮我解释一下这个问题吗?
答案 0 :(得分:7)
在上面的示例中,incrementBySeven和incrementByTen是常量,但这些常量引用的闭包仍然能够增加它们捕获的runningTotal变量。这是因为函数和闭包是引用类型。
无论何时将函数或闭包赋值给常量或变量,实际上都是将该常量或变量设置为对函数或闭包的引用。
答案 1 :(得分:1)
函数是swift中的引用类型。通过代码示例进一步说明这一点。
func countAdder(_ word: String)-> () -> (){
var count = 0
func currentCount(){
count += 1
print(count)
}
return currentCount
}
let countedWord = countAdder("Hello")
let countedWordTwo = countAdder("World")
countedWord() // count is 1
countedWordTwo() // count is 1
//Lets try this
let countedWord = countAdder("Hello")
let countedWordTwo = countedWord
countedWord() // count is 1
countedWordTwo() // now count is 2
我希望能够清楚地解释这个概念。
答案 2 :(得分:0)
首先,Swift中的所有按值分配,如果参数没有ref
,则Swift中的所有按值传递你没有使用&
来传递它。 (如果参数有ref
并且您使用&
传递它,则它将通过引用传递。)无论类型如何都是如此。
目前还不清楚你在问什么。您可能会问函数是值类型(如结构)还是引用类型(如对象的引用),这是一个不同的问题。答案是,因为Swift中的函数是不可变的(没有可以更改的函数的可变“内容”),所以它在语义上是无法区分的,无论它是值类型还是引用类型。无论如何都没有区别。
第二个例子特别让我感到困惑,因为如果我打电话的话 funcVar(3)我不能在case函数中访问bar 由引用分配/返回,因为bar在另一个内部 函数在funcVar的相同范围内
我不明白你在说什么。职能是一等公民。因此,一旦你有了一个函数值,你可以使用它,你可以传递它,你可以返回它,就像其他任何东西一样,任何获得此函数的人都可以像任何其他函数一样使用它。函数值是复制的值类型还是对引用计数对象的引用没有区别。