2017-10-19 10 views
2

ContexteObjective-C: appliquer erreur de compilation en cas de violation d'annotation de la nullabilité

Nous avons développé iOS dynamique public/cadre MacOs. Le framework est écrit en Objective-C, mais il est totalement compatible avec Swift.

Récemment, nous avons changé l'annotation de nullité pour une de nos méthodes API publiques:

de

- (void)setServer:(nullable ABCLocation *)location; 

à

- (void)setServer:(nonnull ABCLocation *)location; 

, donc développeur aurait besoin de créer [ABCLocation default] instance et laissez-passer à la nouvelle API.

Question

Maintenant, nous, comment faire respecter/notifier aux développeurs de modifier leur code existe autour de notre nouvelle API?

Lorsque vous utilisez l'API avec Swift, il semble assez bien gérer la nullabilité en lançant une erreur.

Objective-C, cependant, génère un avertissement que lorsque nil est passé, Xcode ne fait rien, lorsque les développeurs passe une propriété nullable à la méthode.

Comment imposer aux développeurs de modifier leur API? Quelles sont les pratiques courantes ici?

UPD:

Nous distribuons le cadre comme binaire, construit avec configuration Edition, où les assertions sont désactivées.

UPD # 2:

Jusqu'à présent, nous avons accepté la réalité lorsque notre API est utilisée à partir Objective-C. Cependant, nous avons implémenté un comportement "fail safe": si nil est passé, la méthode crée en interne l'instance [ABCLocation default] et la transmet implicitement.

+1

"Xcode ne fait rien, lorsque les développeurs passent une propriété nullable à la méthode." Quelque chose d'autre est faux, vous devriez recevoir des avertissements si c'était le cas. – Mike

Répondre

1

La génération d'un avertissement lorsque l'annotation n'est pas respectée est une bonne pratique. Apporter des modifications comme nullable ->nonnull dans les API ne l'est pas.

+0

Pourriez-vous s'il vous plaît être spécifique à propos de "Faire des changements comme' nullable' -> 'nonnull' dans les API n'est pas [une bonne pratique]"? –

+0

Je voulais simplement dire que faire des changements de rupture d'utilité douteuse dans l'API n'est pas une bonne idée en général –

+0

D'accord. Merci de votre aide! Comme je l'ai mentionné dans ** UPD # 2 **, nous avions ajouté un comportement "fail safe" afin de ne pas casser les choses. Marquer votre réponse comme acceptée, car elle est corrélée avec la décision finale que j'ai prise. –

1

Une pratique courante lorsque le compilateur ne parvient pas à appliquer une erreur (comme dans votre cas) consiste à lancer une erreur d'exécution. Quelque chose comme:

- (void)setServer:(nonnull ABCLocation *)location  
{ 
    if (!location) { 
     NSAssert(NO, @"Location must not be nil"); 
    } 

Ce ne est pas idéal, mais la combinaison d'un avertissement du compilateur lorsque nul est passé et une erreur d'exécution jeté sur l'abus devrait être assez clair pour les développeurs utilisant votre cadre de manière incorrecte.

+0

Nous distribuons le framework sous la forme d'un binaire construit avec la configuration * Release *, où les assertions sont désactivées. Oubliez de le mentionner. J'ai mis à jour la question. –