J'essaie de créer une application iPhone universelle, mais elle utilise une classe définie uniquement dans une version plus récente du SDK. Le framework existe sur des systèmes plus anciens, mais une classe définie dans le framework ne l'est pas.
Je sais que je veux utiliser une sorte de lien faible, mais toute documentation que je peux trouver parle des vérifications à l'exécution de l'existence des fonctions - comment vérifier qu'une classe existe?
ios
backwards-compatibility
weak-linking
psychotik
la source
la source
Réponses:
TLDR
Actuel:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
Héritage:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Swift 2+
Bien qu'historiquement, il ait été recommandé de vérifier les capacités (ou l'existence de classe) plutôt que des versions spécifiques du système d'exploitation, cela ne fonctionne pas bien dans Swift 2.0 en raison de l'introduction de la vérification de disponibilité .
Utilisez plutôt cette méthode:
Remarque: si vous essayez d'utiliser à la place
objc_getClass()
, vous obtiendrez l'erreur suivante:Versions précédentes de Swift
Notez que
objc_getClass()
c'est plus fiable queNSClassFromString()
ouobjc_lookUpClass()
.Objective-C, iOS 4.2+
Voir la réponse de code007 pour plus de détails .
OS X ou versions précédentes d'iOS
Utilisez
NSClassFromString()
. S'il retournenil
, la classe n'existe pas, sinon elle retournera l'objet de classe qui peut être utilisé.C'est la méthode recommandée selon Apple dans ce document :
la source
Class
instance renvoyée parNSClassFromString
(affectez-la àid
) et appelez des sélecteurs sur cette instance.canImport
. PropositionPour les nouveaux projets qui utilisent un SDK de base d'iOS 4.2 ou version ultérieure, il existe cette nouvelle approche recommandée qui consiste à utiliser la méthode de classe NSObject pour vérifier la disponibilité des classes faiblement liées au moment de l'exécution. c'est à dire
source: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
Ce mécanisme utilise la macro NS_CLASS_AVAILABLE, qui est disponible pour la plupart des frameworks sous iOS (notez qu'il peut y avoir un framework qui ne prend pas encore en charge NS_CLASS_AVAILABLE - consultez la note de publication iOS pour cela). Une configuration de paramètres supplémentaire peut également être nécessaire, qui peut être lue dans le lien de documentation d'Apple fourni ci-dessus, cependant, l'avantage de cette méthode est que vous obtenez une vérification de type statique.
la source
UIAlertController
tout en prenant en charge iOS 7. La réponse de code007 est correcte, mais la configuration supplémentaire nécessaire est de lier faiblement (défini deRequired
àOptional
) UIKit dans votre projet (pour cette situation, au moins).