如果未在Swift的内部范围中使用闭包变量,是否不保留?

时间:2019-02-26 07:20:15

标签: ios swift closures breakpoints

我有如下功能:

func fetchComment(postId: String, index: Int, callback: @escaping (_ comment: Comment) -> Void) {
    rtDB!.fetchComment(postId: postId, callback: { comment in
        self.log.debug("postId: \(postId) - comment: \(comment)")
        self.fetchUsersForComments([postId: comment], callback: { usersList in
            // self.log.debug("++++  postId: \(postId) - comment: \(comment)")    // 1
            self.log.debug("postId: \(postId) - usersList: \(usersList)")
        })
    })
}

如果我在1处添加断点并注释掉该行,并打印p comment,则会收到未定义的标识符comment消息。但是comment作为闭包参数传​​递给fetchComment方法。但是,如果我取消注释使用1变量的标记为comment的行,然后打印带有断点的p comment,它将正常工作。如果comment变量未在内部作用域中使用,为什么没有定义? Swift编译器是否正在执行优化并删除变量?我没有启用优化以进行更多调试。

1 个答案:

答案 0 :(得分:1)

在取消注释该行时无法打印comment的原因是因为您当前处于闭包的范围内,而闭包默认情况下不会捕获任何内容。就像您在另一种单独的方法中一样。

取消注释该行时,现在在闭包内部使用comment变量。这意味着闭包必须捕获它。在“分离方法”类比的上下文中,这就像分离方法需要一个名为comment的额外参数。

了解更多here