Вы сказали:
someTask(completion: {[weak self] (result) in
if self == nil {
return
}
//is it safe when reach here?
self!.xxx = yyy
})
Нет!Вы не сохранили self
, поэтому теоретически оно может стать nil
в любое время во время выполнения закрытия.Это, вероятно, не будет, но «вероятно» не достаточно хорош.А восклицательные знаки - это всегда приглашение к краху.
Сделайте слабый-сильный танец и сделайте это правильно:
someTask(completion: {[weak self] (result) in
if let self = self { // or let `self` before Swift 4
// here, self is safe, because you made the reference strong again
self.xxx = yyy
}
})