it-swarm.com.ru

Что является ненулевым в цели C?

Может кто-нибудь уточнить, почему nonnull представлен в iOS 9?

Например, метод NSArray+ (instancetype)array; теперь является + (instancetype nonnull)array;

Смотрите: https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

Это функция уровня объективного уровня c, и как это повлияет на существующие приложения?

14
Mehul Parmar

Они позаботились о том, чтобы везде, где тип не обнулялся, теперь это был тип nonnull

Как и раньше, метод NSMutableArray addObject был 

- (void)addObject:(ObjectType)anObject  

и теперь он был изменен на 

- (void)addObject:(ObjectType nonnull)anObject

Таким образом, это означает, что вы не можете передать нулевой объект (nil) этому методу. Точно так же, в вашем случае

+ (instancetype nonnull) array

метод никогда не вернет nil.

Ссылка: https://developer.Apple.com/Swift/blog/?id=25

17
Mrunal

nonnull - это ключевое слово, сообщающее компилятору, что возвращаемое значение (или параметр, или свойство) никогда не будет равно нулю. Это было введено в предыдущей версии Xcode, чтобы обеспечить лучшую совместимость между необязательными типами Obj-C и Swift.

Вы можете узнать больше об этом на официальный блог Swift

9
rounak

nonnull - это ключевое слово, которое уведомляет компилятор о том, что значение, возвращаемое объектом/параметрами, никогда не будет nil.

В общем, вы должны смотреть на обнуляемый и ненулевой примерно так В настоящее время вы используете утверждения или исключения: нарушением договора является ошибка программиста. В частности, возвращаемые значения - это то, что вы control, поэтому вы никогда не должны возвращать nil для ненулевого возвращаемого типа если это не для обратной совместимости.

3
Nilesh Patel

nullable и nonnull были введены для облегчения взаимодействия Objective C и Swift. 

Цель C не делает никакой разницы между необязательными и необязательными ссылками. Тогда компилятор Swift не может быть уверен, является ли конкретная ссылка на код Objective C необязательной или нет.

обнуляемая аннотация аналогична необязательной в Swift . Ненулевая аннотация аналогична необязательной в Swift.

Практическое правило: любой простой тип указателя будет считаться ненулевым (подробнее читайте официальный блог Swift )

Я бы также сказал, что эта новая аннотация также улучшит качество кода с точки зрения C. Я обычно задаюсь вопросом, будет ли приложение аварийно завершать работу, если в качестве параметра указан nil? Например:

id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];

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

0
agy