示例(在我的视图控制器中):
RESTApi.fetchUser() { [weak self] Void in
if self != nil { //the view controller is still here.
self!.items.append(stuff)
self!.whatever
}
}
我注意到我立即使用if self != nil
,随后是self!
。有没有更好的办法?我觉得这是违反Swift的方式。
注意:我使用[weak self],因为我的ViewController可能是nil(如果用户在REST Api下载数据之前返回)。
答案 0 :(得分:9)
为什么不使用if let
?
if let unwrappedSelf = self {
unwrappedSelf.items.append(stuff)
...
}
您也可以使用guard let
:
guard let unwrappedSelf = self else { return }
unwrappedSelf.items.append(stuff)
...
答案 1 :(得分:6)
空闲时你必须使用比guard
if
guard let strongSelf = self else { return }
strongSelf.items.append(stuff)
答案 2 :(得分:0)
如果您只是在调用闭包时调用self
上的方法,那么您甚至不需要使用if let
,guard let
或if self != nil
。如果self
不是nil,下面的代码也适用于调用方法,如果是,则无需执行任何操作:
RESTApi.fetchUser() { [weak self] in
self?.items.append(stuff)
self?.whatever()
}
此条件展开在所有情况下均可使用,除非您需要将self
或self
属性作为参数传递给非可选函数参数,或指定self
或self
属性为具有非可选类型的变量。
作为一个更广泛的说明,无论如何都不一定需要使self
弱。这通常只有在self
保留将self
内部引用为ivar(循环引用)的闭包时才需要。在你的情况下,它是RestApi
持有对闭包的引用,并且self
所引用的视图控制器将被闭包保留,直到闭包返回。此时,如果视图控制器已经被用户解除,并且闭包的引用是对它的最后一个引用,那么它将在关闭执行后被释放(没有循环引用)。
因此,只有在您特别希望解除视图控制器的场景解除分配实例并且闭包然后根本无法运行任何内容时,才会在此示例中使self
弱。
答案 3 :(得分:0)
只需执行以下操作:
guard let `self` = self else {
return
}
self.items.append(stuff)