尝试解决以下问题'简单'行使;创建一个带有整数数组的函数,一个通过引用传递的函数,它将对数组执行一个操作并返回一个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
这是通过参考传递?因为这有效,但我不确定这是否正确!
答案 0 :(得分:0)
如果参数和返回类型匹配,只需按原样传递函数。
你不需要&amp; ......根本不需要。
试试这个并告诉我。
答案 1 :(得分:0)
编译器告诉您inout f:(Int)->String
与counter()
函数的函数类型不同。如果您从inout
函数和函数调用中的test
中删除&
关键字,一切正常。
您确定练习并不是要求您通过引用传递数组吗?
答案 2 :(得分:0)
首先,通过引用(inout
)传递的情况是,例如,您需要分配给被调用函数内的参数,并将其分配给调用范围中的传递变量,或者您需要的位置在其上调用mutating
方法并将其反映在调用范围等中
您未在f
内分配test
。因此,使它成为inout
是没有意义的,因为它限制了传递给它的内容。
为了从技术上回答为什么会出现错误,答案是你不能通过引用传递一个常量变量(即let
),counter
是一个常量变量(你不能赋值给{{ 1}})。您可以将用于在顶层定义函数的counter
语法与具有闭包表达式的func
类似:
let
就像
func counter(start:Int)->String{ ... }