2016-08-24 2 views
3

Я использую следующий шаблон на некоторое время:Тестирования strongSelf охранника в Swift

closure() { [weak self] in 
    guard let strongSelf = self else { 
     return 
    } 
    // Do some real work here 
} 

Есть ли способ, чтобы проверить заявление возвращения внутри охранника? Или я просто глупо преследую 100% -ный охват кода?

Кроме того, я понимаю, что я мог бы просто использовать if/let вместо охраны/let. Мой вопрос касается сценария охраны/разрешения.

+0

Настройте тестовый блок, в котором используется объект, которому принадлежит это закрытие, затем отпустите его, затем запустите это закрытие и убедитесь, что он не выполняет остальную часть своей функции. Или вместо этого вы можете попытаться просто написать хороший код, не разбавляя свою кодовую базу в погоне за произвольными метрическими целями. – Alexander

+0

Для чего вы используете этот шаблон? Разве это за нарушение сильных эталонных циклов? – Deyton

+0

@Deyton Да, это за нарушение сильных эталонных циклов. Фактический код, который я реализую, более существенный и использует Reactive framework, но этот пример кода должен работать одинаково. –

ответ

0

Если это разрешить сильный опорный цикл и закрытие не мог быть вызван после того, как объект на который ссылается self освобождается, то вы можете быть в состоянии использовать unowned вместо weak (см the ARC section of The Swift Programming Language или this blog post для получения дополнительной информации) ,

С unowned ссылки не являются обязательными, вам не понадобится это заявление guard, и вы будете на одну строку ближе к покрытию 100% кода.

+1

Да, но это имеет смысл только тогда и только тогда, когда закрытие невозможно было вызвать после того, как объект был освобожден (т. Е. Если это происходит так, что ссылка 'weak' не нужна и' unowned' достаточно). Но мы должны предположить, что он использовал «слабый» по какой-то причине. Но если «слабая» ссылка была предназначена исключительно для того, чтобы избежать сильного эталонного цикла, но закрытие никогда не может быть вызвано после того, как объект был освобожден, тогда вы правы, «unowned» - это вариант. – Rob

+0

Хороший вопрос. Я добавлю это к моему ответу для людей, которые пропустили ваш комментарий. – Deyton

+0

К сожалению, я вполне уверен, что мне нужно, чтобы это было слабым, а не незанятым, потому что есть шанс, хотя и малый, что закрытие может быть запущено, пока объект освобождается. Я добавил еще один пример, чтобы проиллюстрировать типичный сценарий, в котором я использую этот шаблон. Если вы считаете, что unowned всегда будет работать в этом сценарии, пожалуйста, дайте мне знать. –

Смежные вопросы