如果不在 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
我有如下功能:
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