Detectar el Simulador

En algunas ocaciones es de bastante utilidad poder expresar condiciones en tiempo de compilación para, si la aplicación se ejecutará en un simulador, se comporte de alguna manera diferente a la usual.

Por ejemplo, en una aplicación que requiera tomar fotos, como no hay cámara en el simulador de iOS, al detectar que se está corriendo en un simulador, se puede saltar completamente la rutina de intentar cargar la cámara e ir al siguiente paso inmediatamente.

A partir de Swift 4.1

Con la actualización de Swift 4.1, una nueva macro de compilación nos permite hacer verificar si la aplicación se está compilando para correr en simuladores.

func capturePhoto() {
#if targetEnvironment(simulator) 
 	// Si es simulador, pasar directamente al preview de una imagen demo
 	
 	let image = // ...
 	let imagePreviewController = ImagePreviewController(image: image)
 	show(imagePreviewController, sender: nil)
#else
 	// Si estamos corriendo en dispositivo, hacer el proceso completo 	
 	
	let imagePicker = // ...
	present(imagePicker, animated: true, completion: nil)
#endif
}

Antes de Swift 4.1

Para detectar el simulador en versiones anteriores a Swift 4.1, se tenía que verificar manualmente el sistema operativo y la arquitectura del procesador objetivo para el que se compilará el código:

func capturePhoto() {
 #if (arch(i386) || arch(x86_64)) && os(iOS)
 	// Si es simulador, pasar directamente al preview de una imagen demo
 	
 	let image = // ...
 	let imagePreviewController = ImagePreviewController(image: image)
 	show(imagePreviewController, sender: nil)
 	
 #else 
 	// Si estamos corriendo en dispositivo, hacer el proceso completo 	
 	
	let imagePicker = // ...
	present(imagePicker, animated: true, completion: nil)
 #endif
}