Подтвердить что ты не робот

Как заставить компилятор считать "nullable" по умолчанию

Так как Xcode 6.3, типы в Objective-C могут быть помечены nullable или nonnull, здесь сообщение в блоге Apple об этом.

Проблема заключается в том, что когда ни один не указан, компилятор импортирует код Objective-C как неявно разворачиваемый в Swift, например. NSView!. Поэтому, когда объект фактически равен нулю, он будет сбой при доступе от Swift. Это означает, что не создает ошибку компилятора.

Поскольку это очень сложно, , я хотел бы, чтобы компилятор принимал все, начиная с Objective-C по умолчанию, как nullable, за исключением случаев, когда это иначе указано через nonnull, или проверенных макросы региона NS_ASSUME_NONNULL_BEGIN / END. Как это можно достичь?

4b9b3361

Ответ 1

Похоже, что нет возможности добавлять аннотации нулевой вероятности, чтобы избавиться от неявно развернутых опций.

Я написал script, который находит все не аннотированные заголовки, которые также могут быть добавлены как фаза сборки, поэтому никакие заголовки упускать из виду.

Ответ 2

Не совсем то, что вы ищете, но из Xcode 7 вы можете включить CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION в настройках LLVM-компилятора, передав флаг -Wnullable-to-nonnull-conversion в флагом флага. Это будет предупреждать, если происходит неявное преобразование из nullable в non-nullable.

Ответ 3

Поскольку макрос определяется как:

#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")

Возможно, стоит попробовать посмотреть, есть ли соответствующий макрос assume_nullable.

#define XX_ASSUME_NULLABLE_BEGIN _Pragma("clang assume_nullable begin")
#define XX_ASSUME_NULLABLE_END   _Pragma("clang assume_nullable end")

Я только сделал быстрый тест, чтобы проверить, не справляется ли эта прагма с компиляцией, чего нет. Но я не проверял, приводит ли это ожидаемые результаты в Swift.