web-dev-qa-db-fra.com

Qu'est-ce qui n'est pas vide dans l'objectif C?

Quelqu'un peut-il expliquer pourquoi nonnull est introduit dans iOS 9?

Par exemple, la méthode NSArray+ (instancetype)array; est maintenant + (instancetype nonnull)array;

Voir: https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

S'agit-il d'une fonctionnalité de niveau objectif-c et quelle incidence cela aurait-il sur les applications existantes?

14
Mehul Parmar

Ils ont veillé à ce que chaque fois que le type ne soit pas nullable, il s'agisse maintenant d'un type nonnull

Comme auparavant, la méthode NSMutableArray addObject était 

- (void)addObject:(ObjectType)anObject  

et maintenant il a été changé pour 

- (void)addObject:(ObjectType nonnull)anObject

Cela signifie donc que vous ne pouvez pas transmettre d'objet null (nil) à cette méthode. De la même façon, dans ton cas

+ (instancetype nonnull) array

méthode ne retournera jamais nil.

Référence: https://developer.Apple.com/Swift/blog/?id=25

17
Mrunal

nonnull est un mot clé qui indique au compilateur que la valeur de retour (ou le paramètre ou la propriété) ne sera jamais nul. Ceci a été introduit dans une version précédente de Xcode pour permettre une meilleure interopérabilité entre les types optionnels d'Obj-C et de Swift.

Vous pouvez en apprendre plus à ce sujet sur le blog officiel de Swift

9
rounak

nonnull est le mot clé qui informe le compilateur que la valeur renvoyée par objet/paramètres ne sera jamais nil.

En général, vous devriez considérer nullable et nonnull à peu près comme Vous utilisez actuellement des assertions ou des exceptions: la violation du contrat est une erreur de programmation. En particulier, les valeurs de retour sont quelque chose que vous Contrôlez, vous ne devez donc jamais renvoyer nil pour un type de retour non nullable Sauf s'il s'agit d'une compatibilité ascendante.

3
Nilesh Patel

nullable et nonnull ont été introduits pour faciliter l'interopérabilité entre Objective C et Swift. 

Objective C ne fait aucune différence entre les références facultatives et non facultatives. Ensuite, le compilateur Swift ne peut pas être sûr si une référence particulière au code Objective C est facultative ou non.

l'annotation nullable est identique à optionnelle dans Swift. L'annotation nonull est identique à celle non optionnelle dans Swift.

La règle de base est que tout type de pointeur simple sera considéré comme non normal (pour plus de détails, lisez le blog officiel de Swift )

Je dirais également que cette nouvelle annotation améliorera également la qualité du code du point de vue de l’objectif C. Je me demande généralement si l’application planterait en cas de pass nil en tant que paramètre? Par exemple:

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

Le compilateur ne dit rien dans ce cas et votre application va planter dans le temps d'exécution! Maintenant, avec cette nouvelle annotation, vous verrez un avertissement au moment de la compilation. Je sais que cet exemple est stupide, mais dans certains cas, vous ne savez pas s'il est nécessaire de vérifier si une propriété est nulle avant d'appeler une méthode, sauf si vous lisez la documentation.

0
agy