在Swift中返回另一个函数的函数

在Swift中返回另一个函数的函数,swift,function,return,Swift,Function,Return,奥拉 假设有一个名为fnOuter(名称:String,mks:Double…)的函数。我想让这个函数返回另一个我可以单独编写的函数,比如fniner(msg:String)->(String,Double,Double,Character)。如何做到这一点? 我是Swift的新手,尝试了以下几点。但最终它以函数“std”作为属性而结束;add()调用Swift编译器抛出的。我做错了什么?我怎样才能解决这个问题?或者这可能吗 func fnRetFn(name:String, mks:Doubl

奥拉

假设有一个名为
fnOuter(名称:String,mks:Double…)的函数
。我想让这个函数返回另一个我可以单独编写的函数,比如
fniner(msg:String)->(String,Double,Double,Character)
。如何做到这一点? 我是Swift的新手,尝试了以下几点。但最终它以函数“std”作为属性而结束;add()调用Swift编译器抛出的。我做错了什么?我怎样才能解决这个问题?或者这可能吗

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 请注意,fniner(msg:String)应该返回一个元组,而不是另一个带有

var outputFn = fnRetFn(name:"Mike", mks:75.3, 87.2)
var std = outputFn
outputFn
std
都是对相同功能的引用 已由
fnRetFn(…)
返回:

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

现在,
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
声明的常量)

使用

var outputFn = fnRetFn(name:"Mike", mks:75.3, 87.2)
var std = outputFn
outputFn
std
都是对相同功能的引用 已由
fnRetFn(…)
返回:

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

现在,
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
声明的常量)

添加括号以实际调用函数:
var std=outputFn()
,正如编译器所建议的那样。@MartinR感谢您的及时响应。问题是,我希望fniner()返回一个元组,而不是一个函数。请原谅,这在最初的问题中并不清楚。我知道这一点,这并没有改变我上面所说的你试过了吗?是的。这很有效。我以前试过。我不明白的是为什么我要叫它?为什么不能像我们返回元组而不是函数时那样访问它(即std.0而不是std().0)。添加括号以实际调用函数:
var std=outputFn()
,正如编译器所建议的那样。@MartinR感谢您的及时响应。问题是,我希望fniner()返回一个元组,而不是一个函数。请原谅,这在最初的问题中并不清楚。我知道这一点,这并没有改变我上面所说的你试过了吗?是的。这很有效。我以前试过。我不明白的是为什么我要叫它?为什么它不能像我们返回元组而不是函数(即std.0而不是std().0)时那样可访问。谢谢@MartinR。我发现了我犯的错误。我没有在
outputFn()调用中插入括号。当我读到你答案的第二行时,我才意识到这一点。再次感谢你的启发。你救了我一天…:)@MartinR“与您的问题无关,但请注意,这两个变量都应该是常量,用let”声明,几乎是最好的部分:)谢谢@MartinR。我发现了我犯的错误。我没有在
outputFn()调用中插入括号。当我读到你答案的第二行时,我才意识到这一点。再次感谢你的启发。你救了我一天…:)@MartinR“与您的问题无关,但请注意,这两个变量都应该是常量,并用let”声明,几乎是最好的部分:)