Swift 嵌套函数与闭包变量

标签 swift

我想创建一个从 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
}

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

关于Swift 嵌套函数与闭包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111737/

相关文章:

swift - MyScript Interactive Ink SDK 转换为数学返回?

ios - 无法移动 Sprite

Swift stackview 在中心添加 subview

swift - SQLite "where"返回 21

ios - 以编程方式创建的自定义 UITableViewCell 不会填充给定数据 - Swift

iOS 9 读取文件权限

ios - 当用户终止应用程序时,我可以进行 api 调用吗?

properties - swift 中的 PFUser 子类

ios - Swift 中的安全本地存储?

ios - 将 UITabBar 定位在顶部