Swift – Ounchecked et Assertions

Préface

Dans Swift, ENABLE_NS_ASSERTIONS est ignoré et si les assertions sont SWIFT_OPTIMIZATION_LEVEL ou désactivées dépend de SWIFT_OPTIMIZATION_LEVEL , voir ici pour plus d'informations .

  • assert() est actif pour -Onone
  • assertionFailure() est actif pour -Onone
  • precondition() est actif pour -Onone et -O
  • preconditionFailure() est actif pour -Onone , -O et -Ounchecked
  • fatalError() est actif pour -Onone , -O et -Ounchecked

Ce que je veux réaliser

Debug et Beta Builds devraient avoir des assertions activées , Release Builds devrait avoir des assertions désactivées .

Comment je pourrais le faire

Je pourrais écrire toutes mes affirmations dans Swift via la méthode precondition et comstackr Release builds avec le drapeau -Ounchecked , bêta construit avec le drapeau -O .

Ce dont je ne suis pas sûr

La valeur par défaut dans iOS pour les versions Release est -O . Y a-t-il quelque chose contre l'utilisation de -Ounchecked pour les versions de versions? Quels autres effets secondaires indésirables pourraient causer cela?

Vous ne devriez certainement pas comstackr -Ounchecked pour la libération afin d'utiliser la precondition seulement pendant le test. Comstackr -Ounchecked désactive également les vérifications pour des choses comme le tableau hors limites et le déballage de nil , ce qui pourrait conduire à des bogues de production assez méchant impliquant une corruption de memory.

Vous pouvez contrôler le comportement d'assertion indépendamment des parameters d'optimization du compilateur via l'argument -assert-config de swiftc :

 $ cat assert.swift assert(false, "assertion asserted") println("made it here...") $ swiftc -Onone assert.swift; ./assert assertion failed: assertion asserted: file assert.swift, line 1 Illegal instruction: 4 $ swiftc -O assert.swift; ./assert made it here... $ swiftc -O -assert-config Debug assert.swift; ./assert assertion failed: assertion asserted: file assert.swift, line 1 Illegal instruction: 4 $ 

Il ne semble pas y avoir de button de configuration Xcode Build pour cela, mais vous pouvez l'append en utilisant le paramètre "Autres drapeaux rapides".