Что является ненулевым в объективном C?
Может кто-нибудь уточнить, почему nonnull
введен в iOS 9?
Например, метод NSArray
+ (instancetype)array;
теперь + (instancetype nonnull)array;
Обратитесь к:
https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html
Является ли это функцией уровня objective-c и как это повлияет на существующие приложения?
Ответы
Ответ 1
Они убедились, что везде, где тип не является нулевым, теперь он имеет тип 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
Ответ 2
nonnull
- это ключевое слово, чтобы сообщить компилятору, что возвращаемое значение (или параметр или свойство) никогда не будет равно нулю. Это было введено в предыдущей версии Xcode, чтобы обеспечить лучшую совместимость между необязательными типами Obj-C и Swift.
Подробнее об этом можно узнать в официальном блоге Swift
Ответ 3
nonnull
- это ключевое слово, которое уведомляет компилятор о том, что значение, возвращаемое объектом/параметрами, никогда не будет nil
.
В общем, вы должны смотреть на нулевую и ненулевую примерно так вы в настоящее время используете утверждения или исключения: нарушение договора ошибка программиста. В частности, возвращаемые значения - это то, что вы, поэтому вы никогда не должны возвращать нуль для возвращаемого типа с нулевым значением если только для обратной совместимости.
Ответ 4
nullable и nonnull были введены для облегчения взаимодействия Objective C и Swift.
Цель C не делает никакой разницы между необязательными и необязательными ссылками. Тогда компилятор Swift не может быть уверен, что конкретная ссылка на Objective C-код является необязательной или нет.
аннулирование с нулевым значением является тем же, что и в Swift.
Необязательная аннотация - это то же самое, что и необязательное в Swift.
Правило большого пальца - любой простой тип указателя будет считаться ненулевым (более подробно читайте официальный блог Swift)
Я бы также сказал, что эта новая аннотация также улучшит качество кода с точки зрения Objective C. Я обычно задаюсь вопросом, может ли приложение сбой, если параметр nil в качестве параметра? Например:
id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];
Компилятор ничего не говорит в этом случае, и ваше приложение будет аварийно завершено во время выполнения! Теперь с этой новой аннотацией вы увидите предупреждение во время компиляции. Я знаю, что этот пример глупо, но есть некоторые случаи, когда вы не знаете, нужно ли проверять, является ли свойство нулем перед вызовом метода, если вы не прочитали документацию.