Imagina que estamos haciendo un juego. La dificultad de este juego se puede cambiar en tiempo real (mitad del juego) y será controlable en todo momento con tres botones que siempre están en la pantalla.

El tipo Swift que representa el "estado" de esta aplicación es:

enum CurrentDifficultyState {
    case low
    case medium
    case max
}

Digamos que hemos puesto este código en el ViewController.

Pero ... en nuestro modelo ... tenemos algo como enemyController.swift que tiene una función miembro como generateEnemy(currentDifficulty: CurrentDifficultyState).

La "dificultad" de este enemigo dependerá del estado de esta enumeración en el momento en que se genera.

Sin embargo, cuando lo hacemos así, XCode se queja (desde dentro del archivo enemyController.swift) de que no existe tal tipo como "CurrentDifficultyState" presumiblemente porque no se ha definido dentro del archivo enemyController.swift (se escribió en el Archivo ViewController).

Entonces ... ¿cuál es la forma correcta de manejar esto? ¿Dónde podemos mover este código (o qué palabra clave falta) para que sea un tipo aceptado global (estático?) Como String o Int ... accesible para todas las clases en todo el aplicación?

Lo que terminé haciendo fue crear un nuevo archivo rápido llamado "myGlobalTypes.swift" y poner el código de enumeración allí.

¡Esto funciona!

Pero esto parece una mala manera de hacerlo.

¿Alguien podría iluminarme? ¡Gracias!

PD: No pidas más código ... lo del "juego" fue solo un ejemplo hipotético para dar un contexto a la pregunta (que es general) ... pero no tengo la experiencia suficiente para hacer la pregunta real en blanco porque no conozco todos los términos relevantes.

1
Boober Bunz 18 ene. 2018 a las 09:46

3 respuestas

La mejor respuesta

Simplemente coloque su enum en el ámbito de nivel superior en el archivo que desee. Por ejemplo, colóquelo dentro de un archivo Controller.swift enemigo en el nivel superior (fuera de la clase UIViewController)

3
Vadim Popov 18 ene. 2018 a las 06:55

Poner la enumeración en un archivo separado no es "basura" - IMO, si es un tipo importante, es bueno ponerlo en un lugar destacado.

Su pregunta original es difícil de responder sin más código. No hay problema con poner un tipo en un archivo y usarlo en otro archivo siempre que no lo marque private / fileprivate y permanezca en el mismo módulo. Supongo que coloca la enumeración dentro de otra clase, en cuyo caso aún podría usarla en otros archivos si usara el nombre de tipo completo, p. OtherClass.currentDifficultyState.

Un consejo final no relacionado: aproximadamente el 99.9% de todo el código Swift en el mundo comienza los nombres de tipo con una letra mayúscula, y le recomiendo encarecidamente que siga esta convención: hace que trabajar con otros programadores y bibliotecas externas sea mucho más fácil.

2
dr_barto 18 ene. 2018 a las 06:56

En el archivo ViewController:

// file start
enum currentDifficultyState {
...
}

class ViewController: UIViewController {
...
}
// file end
2
Dean Huang 18 ene. 2018 a las 06:57
48315315