2017-09-10 4 views
2

J'ai des problèmes avec NSAttributedStringKey.attachment et NSAttachmentAttributeName. Voici le code pertinent:NSAttributedStringKey.attachment versus NSAttachmentAttributeName

var key: Any? 
    if #available(iOS 11, *) { 
     key = NSAttributedStringKey.attachment 
    } 
    else { 
     key = NSAttachmentAttributeName 
    } 

Une des deux choses se passe. Dans le lieu même où je suis en train d'utiliser ce code (un Cococapod de ma propre conception, avec un objectif de déploiement d'iOS 8 et maintenant la construction avec Xcode 9), je reçois une erreur:

Type 'NSAttributedStringKey' (aka 'NSString') has no member 'attachment' 

Ou, si je viens de faire un nouvel exemple de projet et de définir la cible de déploiement à iOS 8, je reçois:

'NSAttachmentAttributeName' has been renamed to 'NSAttributedStringKey.attachment' 

Ce n'est pas le comportement que je me attends avec #available. Pensées?

Répondre

1

Ce String vs struct différence entre Swift 3 (utilise String s tels que NSAttachmentAttributeName) et Swift 4 (utilise les attributs statiques struct tels que NSAttributedStringKey.attachment), pas entre iOS < 11 et iOS> = 11. Par exemple, vous pouvez utiliser NSAttributedStringKey.attachment et similaire dans n'importe quelle version d'iOS (par exemple .attachment est disponible depuis iOS 7) dans un projet Swift 4. #available ne s'applique pas car il s'agit d'une différence de version de langue Swift plutôt que d'une différence de version du système d'exploitation.

Assurez-vous que votre pod est réglé sur la bonne version de Swift et qu'il devrait fonctionner comme prévu. Vous pouvez dire CocoaPods que par l'ajout d'un fichier .swift-version en haut de votre projet:

$ echo 4.0 >.swift-version 

Ce fichier version magique est mentionné en passant dans un billet de blog CocoaPods de l'année dernière: http://blog.cocoapods.org/CocoaPods-1.1.0/

+0

Merci, @ Andrew Herbert ! Il semble que je devais explicitement définir SWIFT_VERSION du pod dans les paramètres de construction, mais peut-être que faire une mise à jour de pod était insuffisant après avoir changé la version .swift. Dans tous les cas, l'utilisation de Swift 4 résout définitivement le problème. –