是通过值还是通过引用分配/传递Swift函数?

时间:2015-09-02 16:24:41

标签: swift function pass-by-reference variable-assignment pass-by-value

当Swift中的函数被赋值给变量或作为嵌套函数从高级函数返回时,它是通过值还是通过引用传递的?我写的时候:

func foo() -> Bool
{
    return false
}

var funcVar = foo

funcVarfoo()收到对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 ++背景我很惊讶它编译)。 有人可以帮我解释一下这个问题吗?

3 个答案:

答案 0 :(得分:7)

来自Apple documentation

  

在上面的示例中,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的相同范围内

我不明白你在说什么。职能是一等公民。因此,一旦你有了一个函数值,你可以使用它,你可以传递它,你可以返回它,就像其他任何东西一样,任何获得此函数的人都可以像任何其他函数一样使用它。函数值是复制的值类型还是对引用计数对象的引用没有区别。