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

Does a closure variable not retained if not used in inner scope in Swift?

我有如下功能:

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 编译器进行优化并删除变量吗?我没有为 debug more 启用优化。

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

当您取消注释该行时,您现在正在闭包内使用 comment 变量。这意味着闭包必须捕获它。在 "separate method" 类比的上下文中,这就像单独的方法接受一个名为 comment.

的额外参数

阅读更多here