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

时间:2016-11-15 09:23:04

标签: swift function return

奥拉,

假设有一个名为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)应返回元组,而不是其他函数

1 个答案:

答案 0 :(得分:2)

使用

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

outputFnstd都是对同一函数的引用 由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声明。)