【问题标题】:How to pass functions by reference如何通过引用传递函数
【发布时间】:2015-04-23 02:53:46
【问题描述】:

我正在尝试解决这个问题:

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

我遇到了问题。经过多次搜索无济于事,我将问题分解为代码段,以单独测试每一段。

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

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)->String is not convertible to @lvalue inout $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

这是通过引用传递吗?由于这行得通,我不确定这是否正确。

我做错了什么?

【问题讨论】:

    标签: function swift pass-by-reference


    【解决方案1】:

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

    您根本不需要&amp;...

    【讨论】:

    • 嗨 Helen,是的,上面确实有效,但除非函数在作为参数传递给另一个函数时在 Swift 中通过引用传递,否则我并没有像书中所说的那样做练习;即 创建一个函数,该函数返回一个整数,并将整数数组和对函数的引用作为参数。这个新函数应该将提供的函数应用于数组并返回结果.
    【解决方案2】:

    首先,通过引用传递(inout)适用于例如您需要分配给被调用函数内部的参数并将其分配给调用范围内传递的变量的情况,或者您需要调用的地方一个mutating 方法并让它反映在调用范围等中。

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

    从技术上回答为什么会出错,答案是不能通过引用传递常量变量(即let),而counter 是常量变量(不能分配给counter)。您可以认为在顶层定义函数的 func 语法类似于带有闭包表达式的 let

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

    就像

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

    【讨论】:

    • 感谢 newacct 的回答。很抱歉打扰你,但你能解释一下你是如何通过引用 Swift 中的另一个函数来传递一个函数的吗?
    • @Mortoman:你会做同样的事情。但是你通过引用传递的变量必须是用var声明的变量。
    【解决方案3】:

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

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

    【讨论】:

    • 嗨,是的,这个练习来自 SAM 的书“24 小时内快速学习”,并特别要求以下内容...... 创建一个返回整数并接受整数数组的函数对作为参数的函数的引用。这个新函数应该将提供的函数应用于数组并返回结果.
    • 啊……我敢打赌,这本书在这种情况下非技术性地使用了“参考”一词。它不是告诉您通过引用传递函数,而是创建一个函数,然后创建另一个将其作为参数的函数。在这种情况下,您作为参数传入的函数名称将是“引用”,但同样不是严格的技术术语。您不能在 Swift 中通过引用传递函数。这根本不可能。没有inout 函数参数之类的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2020-10-02
    • 2018-06-26
    相关资源
    最近更新 更多