В приложениях iOS часто наблюдается следующий шаблон:
class MyViewController: UIViewController {
let myModel = MyModel()
override func viewDidLoad() {
super.viewDidLoad()
myModel.foo() { [***] in
// use self here
}
}
}
class MyModel {
public func foo(complete: () -> Void) {
// do something
complete()
}
}
Консенсус заключается в том, чтобы вместо [***]
или [weak self]
использовать [***]
, не имеющий права, если вы можете гарантировать, что self не будет nil на момент завершения и слабым, если вы не уверены, что ссылка будут по-прежнему действительны.
То, что я не понимаю, - это то, почему я когда-либо рискнул бы использовать unowned, возможно, я уверен, что сейчас ссылка никогда не будет нулевой, но это может измениться в будущем. Я мог бы также забыть о краю, ошибки случаются. Я мог бы так же легко всегда использовать слабый, и поставить охрану в верхней части крышки, чтобы иметь возможность использовать себя без! или?.
Что такое использование неработающих? Это быстрее, чем слабый + охранник? Это синтаксический сахар? Похоже, что это противоречит философии Свифта, защищающей разработчика от распространенных ошибок, которые могут вызвать сбои.