swift 3中的嵌套函数

Posted

技术标签:

【中文标题】swift 3中的嵌套函数【英文标题】:Nested function in swift 3 【发布时间】:2017-05-04 07:15:50 【问题描述】:

我正在查看 Alamofire 文档并找到以下代码

 Alamofire.request("https://httpbin.org/get").responseJSON  response in
debugPrint(response)

if let json = response.result.value 
    print("JSON: \(json)")


好像函数写成这样

Class.Function().Function

这叫做嵌套函数吗?如果是这样,我将如何创建一个简单的嵌套函数来了解语法

【问题讨论】:

这只是方法链(Alamofire 自述文件中也提到过) 对于尾随闭包语法,请参见例如***.com/questions/26127427/…。 【参考方案1】:

这不是一个嵌套函数,而是一个函数链。

class Alamofire 
    static func request(_ url: String)->Request 
        //... code ...
        return aRequest
    


class Request 
    func responseJson(completion: (response: Response)->()) 
        //code
    

所以这就是正在发生的事情。 Alamofire 的 request 函数返回一个 Request 对象,该对象具有 responseJson 函数,该函数接受一个闭包作为参数。

swift中如果闭包参数是最后一个,可以通过去掉参数名来合成函数调用,将闭包定义为函数这样就可以了

Alamofire.request("whatever").responseJson(completion:  (response) in 
    //whatever
)

和做的一模一样

Alamofire.request("whatever").responseJson() (response) in 
    //whatever

这是一个尾随闭包。您可以在“尾随闭包”段落中找到有关它的更多信息here。

希望对你有帮助

【讨论】:

【参考方案2】:

它是Method chaining,最后一个是尾随闭包的语法。

闭包是可以传递的独立功能块 并在您的代码中使用。

    func someFunctionThatTakesAClosure(closure: () -> Void) 
    // function body goes here


// Here's how you call this function without using a trailing closure:

someFunctionThatTakesAClosure(closure: 
    // closure's body goes here
)

// Here's how you call this function with a trailing closure instead:

someFunctionThatTakesAClosure() 
    // trailing closure's body goes here

有关闭包的更多信息,请阅读it

【讨论】:

以上是关于swift 3中的嵌套函数的主要内容,如果未能解决你的问题,请参考以下文章

init 函数中的 Swift 嵌套类型

嵌套函数有啥好处(一般/在 Swift 中)

Swift 中的高阶函数和函数嵌套

当您在 Swift 中有嵌套函数时,如何将布尔值返回给外部函数?

swift中嵌套函数的实际用途是啥? [复制]

嵌套回调函数不能正常工作 swift