Есть ли способ обнаружить принудительную развертку в проекте Swift?

Есть ли способ (с помощью флага компилятора или скрипта) обнаружить принудительную развертку в проекте Swift?

Я думаю о таких вещах:

let b = a as! B
let c = a!
a!.method()

Например, без ложных срабатываний для var a: A!.


person ldiqual    schedule 12.12.2015    source источник
comment
Вы можете выполнить поиск по регулярным выражениям [^\1]![\s\p{P}], чтобы найти такие экземпляры, включая неявно развернутые необязательные параметры (их использование обычно так же плохо, как и принудительное развертывание), за исключением оператора префикса ! для Bools и подобных. Я размещал это здесь ранее, дайте мне знать, если это ответит на ваш вопрос, и я опубликую это как ответ   -  person Kametrixom    schedule 12.12.2015
comment
Использование оператора принудительной развертки, оператора принудительного приведения (as!) или оператора игнорирования ошибки (try!) не является безоговорочно и повсеместно плохим. Точно так же использование типа ImplicitlyUnwrappedOptional<T> -- все эти конструкции можно использовать безопасно, с осторожностью или бездумно, так как это может привести к ошибкам. Я бы согласился, что первые три являются скорее признаком небрежного кодирования, чем использование типа IUO, тем не менее, особенно учитывая, что IUO необходимы (и рекомендуются) для таких случаев использования, как торговые точки IB.   -  person rickster    schedule 13.12.2015


Ответы (1)


Как отмечено в комментариях, поиск по регулярным выражениям может быть создан для обнаружения большинства случаев использования постфикса !. (И если вы будете осторожны, вы сможете заставить его игнорировать большинство случаев использования двоеточия-типа-банга, чтобы вы не получали шума от объявлений типа IUO.)

Это почти настолько хорошо, насколько это возможно, и это неполно - например, каждый раз, когда вы вызываете API, который возвращает тип IUO, и получаете доступ к его результату, не проверяя необязательный параметр, вы могли бы выполнять принудительную развертку, не имея явного удары в вашем коде.

Любой инструмент, который пытается постоянно предупреждать о непроверенных развертываниях, должен иметь довольно глубокие знания системы типов Swift, грамматики и правил вывода типов. И на самом деле единственное место, где вы можете иметь такие знания (и иметь их правильно), находится внутри компилятора. Так что вам, вероятно, лучше всего подать запрос на добавление функций в Apple или работать с проект с открытым исходным кодом.

person rickster    schedule 13.12.2015