我发现自己使用“if self!= nil”因为[弱自我] ......这是正常的吗?

时间:2016-04-20 03:58:17

标签: swift

示例(在我的视图控制器中):

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下载数据之前返回)。

4 个答案:

答案 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 letguard letif self != nil。如果self不是nil,下面的代码也适用于调用方法,如果是,则无需执行任何操作:

RESTApi.fetchUser() { [weak self] in 
    self?.items.append(stuff)
    self?.whatever()
}

此条件展开在所有情况下均可使用,除非您需要将selfself属性作为参数传递给非可选函数参数,或指定selfself属性为具有非可选类型的变量。

作为一个更广泛的说明,无论如何都不一定需要使self弱。这通常只有在self保留将self内部引用为ivar(循环引用)的闭包时才需要。在你的情况下,它是RestApi持有对闭包的引用,并且self所引用的视图控制器将被闭包保留,直到闭包返回。此时,如果视图控制器已经被用户解除,并且闭包的引用是对它的最后一个引用,那么它将在关闭执行后被释放(没有循环引用)。

因此,只有在您特别希望解除视图控制器的场景解除分配实例并且闭包然后根本无法运行任何内容时,才会在此示例中使self弱。

答案 3 :(得分:0)

只需执行以下操作:

   guard let `self` = self else {
       return
   }
   self.items.append(stuff)