我有如下功能:
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编译器是否正在执行优化并删除变量?我没有启用优化以进行更多调试。
答案 0 :(得分:1)
在取消注释该行时无法打印comment
的原因是因为您当前处于闭包的范围内,而闭包默认情况下不会捕获任何内容。就像您在另一种单独的方法中一样。
取消注释该行时,现在在闭包内部使用comment
变量。这意味着闭包必须捕获它。在“分离方法”类比的上下文中,这就像分离方法需要一个名为comment
的额外参数。
了解更多here