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;
S'agit-il d'une fonctionnalité de niveau objectif-c et quelle incidence cela aurait-il sur les applications existantes?
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
.
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
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.
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.