Mise à jour 30/01/19
Bien que cette réponse puisse fonctionner, la solution recommandée pour une vérification statique (telle que clarifiée par plusieurs ingénieurs Apple) consiste à définir un indicateur de compilateur personnalisé ciblant les simulateurs iOS. Pour des instructions détaillées sur la façon de procéder, voir la réponse de @ mbelsky .
Réponse originale
Si vous avez besoin d'une vérification statique (par exemple pas un runtime si / sinon), vous ne pouvez pas détecter directement le simulateur, mais vous pouvez détecter iOS sur une architecture de bureau comme suit
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Après la version Swift 4.1
Dernière utilisation, maintenant directement pour tous dans une condition pour tous les types de simulateurs doivent appliquer une seule condition -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Pour plus de précisions, vous pouvez consulter la proposition Swift SE-0190
Pour l'ancienne version -
De toute évidence, cela est faux sur un appareil, mais cela renvoie vrai pour le simulateur iOS, comme spécifié dans la documentation :
La configuration de construction arch (i386) renvoie true lorsque le code est compilé pour le simulateur iOS 32 bits.
Si vous développez pour un simulateur autre que iOS, vous pouvez simplement faire varier le os
paramètre: par exemple
Détectez le simulateur watchOS
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Détecter le simulateur tvOS
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Ou même détecter n'importe quel simulateur
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Si vous êtes plutôt d'accord avec une vérification de l'exécution, vous pouvez inspecter la TARGET_OS_SIMULATOR
variable (ou TARGET_IPHONE_SIMULATOR
dans iOS 8 et ci-dessous), ce qui est vrai sur un simulateur.
Veuillez noter que cela est différent et légèrement plus limité que l'utilisation d'un indicateur de préprocesseur. Par exemple, vous ne pourrez pas l'utiliser à un endroit où a if/else
est syntaxiquement invalide (par exemple en dehors des étendues de fonctions).
Supposons, par exemple, que vous souhaitiez avoir des importations différentes sur l'appareil et sur le simulateur. C'est impossible avec une vérification dynamique, alors que c'est trivial avec une vérification statique.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
De plus, comme l'indicateur est remplacé par a 0
ou a 1
par le préprocesseur rapide, si vous l'utilisez directement dans une if/else
expression, le compilateur émet un avertissement concernant le code inaccessible.
Pour contourner cet avertissement, consultez l'une des autres réponses.