Swift嵌套函数与闭包变量

Swift嵌套函数与闭包变量,swift,Swift,我想创建一个函数,从CloudKit获取记录,如果遇到临时网络错误,该函数应该重试 func fetchRecord(withRecordID recordID: CKRecordID, returnBlock: (optError: ErrorType?) -> Void){ func internalReturnBlock(optError optError: ErrorType?){ if NSThread.isMainThread() {

我想创建一个函数,从CloudKit获取记录,如果遇到临时网络错误,该函数应该重试

func fetchRecord(withRecordID recordID: CKRecordID, returnBlock: (optError: ErrorType?) -> Void){

    func internalReturnBlock(optError optError: ErrorType?){
        if NSThread.isMainThread() {
            returnBlock(optError: optError)
        }
        else{
            dispatch_async(dispatch_get_main_queue(), { 
                returnBlock(optError: optError)
            })
        }
    }

    func internalWork(){
        privateDB.fetchRecordWithID(recordID) { (optRecord, optError) in
            if let error = optError{
                // IF NETWORK ERROR RETRY
                internalWork()
            }
            else{
                internalReturnBlock(optError: nil)
            }
        }
    }

    internalWork()
}
这里我定义了这样一个函数(简化),如果fetch遇到错误,它将通过调用嵌套函数internalWork()重试

我的问题是,使用嵌套函数和创建局部闭包变量之间有什么区别? 例如,这里我将internalReturnBlock更改为闭包变量:

func fetchRecord2(withRecordID recordID: CKRecordID, returnBlock: (optError: ErrorType?) -> Void){

    var internalReturnBlock = { (optError: NSError?) in
        if NSThread.isMainThread() {
            returnBlock(optError: optError)
        }
        else{
            dispatch_async(dispatch_get_main_queue(), {
                returnBlock(optError: optError)
            })
        }
    }

    func internalWork(){
        privateDB.fetchRecordWithID(recordID) { (optRecord, optError) in
            if let error = optError{
                // IF NETWORK ERROR RETRY
                internalWork()
            }
            else{
                internalReturnBlock(nil)
            }
        }
    }


    internalWork()
}
使用嵌套函数与使用可变块之间有什么区别?
有什么好处或问题吗?

效果没有区别。一个是具有名称的声明函数,另一个是匿名函数。但它们都是功能。函数在Swift中是闭包,所以它们都是闭包

匿名函数允许使用一些形式缩写,例如在返回值的一行中省略
return
。但这些缩略语都不会产生任何最终的效果

但是,Swift中的匿名函数有一个声明函数没有的特性—捕获列表。这有助于避免保留循环

f {
    [unowned self] in
    return self.name
} 
此外,匿名函数是在将其作为参数的函数声明之后定义的,因此它可以使用该声明中出现的术语:

f(param:String) {
    return param
}

但是,如果您没有使用这些功能,那么使用哪种功能无关紧要。它们的工作原理相同

阅读我的书可能会对您有所帮助:请注意,我从声明函数切换到匿名函数的动机基本上就是名称是不必要的。谢谢您提供详细的答案!,我还发现闭包变量本身不能调用,至少不能以我声明它的方式调用,所以internalWork()必须保持为嵌套func。这一点很好!有办法绕过这一限制;然而,我不确定你的递归是不是一个好主意。如果我们永远无法通过怎么办?您最终会遇到一个真实的堆栈溢出。是的,您是对的,递归必须具有retryLimit.:)