web-dev-qa-db-fra.com

Comment déterminer le type d'appareil à partir de Swift? (OS X ou iOS)

Je sais que Swift est relativement nouveau, mais je me demandais s’il existait un moyen de déterminer le type d’appareil?

(Comme vous pouviez faire avec un #define)?

Je voudrais surtout savoir comment différencier OS X ou iOS. Je n'ai rien trouvé sur le sujet.

29
user1947561

Si vous compilez pour iOS et OS X (et peut-être maintenant pour watchOS et tvOS également), vous construisez votre code au moins deux fois: une fois pour chaque plate-forme. Si vous souhaitez exécuter un code différent sur chaque plate-forme, vous souhaitez une vérification conditionnelle au moment de la construction, pas une vérification à l'exécution. 

Swift n'a pas de préprocesseur, mais il a des directives de construction conditionnelles - et la plupart du temps, elles ressemblent à l'équivalent en C.

#if os(iOS) || os(watchOS) || os(tvOS)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
    println("OMG, it's that mythical new Apple product!!!")
#endif

Vous pouvez également utiliser des configurations de construction pour tester l'architecture (x86_64, arm, arm64, i386) ou -D du compilateur (y compris l'indicateur DEBUG défini par les modèles Xcode standard).

Voir Directives du préprocesseur in Utilisation de Swift avec Cocoa et Objective-C.

(Si vous souhaitez distinguer le type de périphérique iOS sur lequel vous vous trouvez au moment de l'exécution, utilisez la classe UIDevice comme vous le feriez avec ObjC. Il est généralement plus utile et plus sûr de consulter les attributs de périphérique importants pour vous plutôt que de périphérique. nom ou idiome - par exemple, utilisez des traits et des classes de taille pour structurer votre interface utilisateur, demandez à OpenGL les fonctionnalités GPU dont vous avez besoin, etc.)

57
rickster

Depuis Swift 4.2, vous pouvez remplacer

#if os(iOS) || os(watchOS) || os(tvOS)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
     println("OMG, it's that mythical new Apple product!!!")
#endif

Par  

#if canImport(UIKit)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
    #error("OMG, it's that mythical new Apple product!!!")
#endif
1
raed