Swift编程:通过引用传递的函数

时间:2015-02-21 12:20:25

标签: function swift pass-by-reference

尝试解决以下问题'简单'行使;创建一个带有整数数组的函数,一个通过引用传递的函数,它将对数组执行一个操作并返回一个Int结果。我创建了代码但有问题;经过SO搜索和其他互联网站点(无济于事)后,我尝试将问题分解为基本的代码段,以便单独测试每个部分。

我的简单传递功能参考代码',如下......

func counter(start:Int)->String{
 for var i = 0 ; i<start; ++i{
    println("I => \(i)")
 }
 return "Done"
}

func test(i:Int, inout f:(Int)->String){
 f(i)
}

test(5,&counter)

问题甚至是我通过引用传递函数的简单测试失败,出现以下编译器错误......

(Int) - &gt;字符串不能转换为@lvalue in $ T3

你能告诉我,我在这里做错了吗???

提前感谢。

更新

好的,如果我做以下事情......

func counter(end:Int)->String{
for var i = 0 ; i<end; ++i{
    println("I => \(i)")
}
return "Done"
}

func test(i:Int, inout f:(Int)->String){
f(i)
}

var f1 = counter
test(5,&f1)//pass a reference as an argument to the function

这是通过参考传递?因为这有效,但我不确定这是否正确!

3 个答案:

答案 0 :(得分:0)

如果参数和返回类型匹配,只需按原样传递函数。

你不需要&amp; ......根本不需要。

试试这个并告诉我。

答案 1 :(得分:0)

编译器告诉您inout f:(Int)->Stringcounter()函数的函数类型不同。如果您从inout函数和函数调用中的test中删除&关键字,一切正常。

您确定练习并不是要求您通过引用传递数组吗?

答案 2 :(得分:0)

首先,通过引用(inout)传递的情况是,例如,您需要分配给被调用函数内的参数,并将其分配给调用范围中的传递变量,或者您需要的位置在其上调用mutating方法并将其反映在调用范围等中

您未在f内分配test。因此,使它成为inout是没有意义的,因为它限制了传递给它的内容。

为了从技术上回答为什么会出现错误,答案是你不能通过引用传递一个常量变量(即let),counter是一个常量变量(你不能赋值给{{ 1}})。您可以将用于在顶层定义函数的counter语法与具有闭包表达式的func类似:

let

就像

func counter(start:Int)->String{ ... }