【问题标题】:Functions that return another function in Swift在 Swift 中返回另一个函数的函数
【发布时间】:2017-03-29 02:50:29
【问题描述】:

奥拉,

假设有一个名为fnOuter(name:String, mks:Double...) 的函数。我希望这个函数返回另一个我可以单独编写的函数,例如fnInner(msg:String)->(String, Double, Double, Character)。怎么能做到这一点? 我是 Swift 的新手,并尝试了以下方法。但最终它以 Swift 编译器抛出的function 'std' was used as a property; add () to call it 告终。我在这里做错了什么?我该如何解决这个问题?或者这甚至可能吗?

func fnRetFn(name:String, mks:Double...) -> (() -> ((String, Double, Double, Character))){
    var msg = "Hello " + String(name) + "!"

    func calculate() -> (String, Double, Double, Character){
        var total:Double = 0.0
        var i: Double = 0.0
        for mk in mks{
            total += mk
            i += 1
        }

        var avg = total / i

        var grd : Character
        if avg >= 75.0{
            grd = "A"
        }

        else if avg >= 55.0{
            grd = "B"
        }

        else{
            grd = "F"
        } 

        return (msg, total, avg, grd)
    }

    return calculate
}

var outputFn = fnRetFn(name:"Mike", mks:75.3, 87.2)
var std = outputFn
print("\(std.0)")
print("\(std.1)")
print("\(std.2)")
print("\(std.3)")

编辑 1 请注意 fnInner(msg:String) 应该返回一个元组,而不是另一个函数

【问题讨论】:

  • 添加括号以实际调用函数:var std = outputFn(),正如编译器所建议的那样。
  • @MartinR 感谢您的及时回复。问题是,我希望 fnInner() 返回一个元组,而不是一个函数。请原谅我在最初的问题中并不清楚。
  • 我知道这一点,它不会改变我上面所说的。 – 你试过了吗?
  • 是的。这样可行。我以前试过。我不知道为什么我必须打电话给它?为什么它不像我们返回元组而不是函数时那样可访问(即 std.0 而不是 std().0)。

标签: swift function return


【解决方案1】:

var outputFn = fnRetFn(name:"Mike", mks:75.3, 87.2)
var std = outputFn

outputFnstd 都是对同一个 function 的引用 被fnRetFn(...)返回:

print(std) // (Function)

调用该函数,您必须附加参数列表 在括号内。对于不带参数的函数 空列表():

var outputFn = fnRetFn(name:"Mike", mks:75.3, 87.2)
var std = outputFn()

现在std 是调用“内部”函数返回的元组

print(std) // ("Hello Mike!", 162.5, 81.25, "A")
print(std.0, std.1, std.2, std.3) // Hello Mike! 162.5 81.25 A

(与您的问题无关,但请注意,两个变量都应使用let 声明常量。)

【讨论】:

  • 谢谢@MartinR。我发现了我犯的错误。我错过了在outputFn() 电话中加上括号。只有当我读到你答案的第二行时,我才意识到这一点。再次感谢您启发我。你拯救了我的一天...... :)
  • @MartinR "与您的问题无关,但请注意,这两个变量都应该是用 let 声明的常量" 几乎是其中最好的部分:)
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多