Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何通过引用传递函数_Function_Swift_Pass By Reference - Fatal编程技术网

Function 如何通过引用传递函数

Function 如何通过引用传递函数,function,swift,pass-by-reference,Function,Swift,Pass By Reference,我试图解决这个问题: 创建一个接受整数数组的函数,该函数通过引用传递,将对数组执行操作并返回Int结果 我有问题。在多次搜索都没有结果之后,我将问题分解成代码片段,单独测试每一个片段 我简单的“通过参考代码传递函数”是: 如果我这样做: func counter(end:Int)->String{ for var i = 0 ; i<end; ++i{ println("I => \(i)") } return "Done" } func test(i:I

我试图解决这个问题:

创建一个接受整数数组的函数,该函数通过引用传递,将对数组执行操作并返回Int结果

我有问题。在多次搜索都没有结果之后,我将问题分解成代码片段,单独测试每一个片段

我简单的“通过参考代码传递函数”是:

如果我这样做:

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
func计数器(结束:Int)->字符串{
对于变量i=0;iString){
f(i)
}
变量f1=计数器
test(5,&f1)//将引用作为参数传递给函数
这是通过参考吗?由于这是有效的,我不确定这是正确的


我做错了什么?

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


你根本不需要
&…

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


您确定练习没有要求您通过引用传递数组吗?

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

您没有在
test
内部分配给
f
。因此,将其设置为
inout
,是毫无意义的,因为它限制了可以传递给它的内容

要从技术上回答出现错误的原因,答案是不能通过引用传递常量变量(即
let
),而
计数器
是常量变量(不能分配给
计数器
)。您可以将定义顶层函数的
func
语法想象为类似于带有闭包表达式的
let

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

let counter : Int->String = { (start:Int)->String in ... }

嗨,是的,练习来自SAMs手册“24小时学习swift”具体要求如下…创建一个函数,返回一个整数,并将整数数组和对函数的引用作为参数。这个新函数应该将提供的函数应用于数组并返回结果。啊…我敢打赌这本书使用的是术语“引用”在这种情况下,非技术性。它不是告诉您通过引用传递函数,而是告诉您创建一个函数,然后创建另一个将其作为参数的函数。您作为参数传递的函数名将是“引用”在这种情况下,虽然也不是严格的技术术语。你不能在Swift中通过引用传递函数。这是不可能的。没有所谓的
inout
函数参数。Helen,您好,上述方法确实有效,但除非函数作为参数传递给另一个函数时,在Swift中通过引用传递,否则我不会真正按照书中所述做练习;即创建一个函数,该函数返回一个整数,并将整数数组和对函数的引用作为参数。此新函数应将提供的函数应用于数组并返回结果。感谢您的回答newacct。很抱歉再次打扰您,但您能否解释一下您是如何做的在Swift中,是否通过引用另一个函数来定义函数?@Mortoman:您也可以这样做。但通过引用传递的变量必须是用
var
声明的变量。
func counter(start:Int)->String{ ... }
let counter : Int->String = { (start:Int)->String in ... }