Archivo de constantes globales en Swift

Resuelto user1028028 asked hace 54 años • 15 respuestas

En mis proyectos de Objective-C suelo utilizar un archivo de constantes globales para almacenar cosas como nombres de notificaciones y claves para NSUserDefaults. Se parece a esto:

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

¿Cómo hago exactamente lo mismo en Swift?

user1028028 avatar Jan 01 '70 08:01 user1028028
Aceptado

Estructuras como espacio de nombres

En mi opinión, la mejor manera de lidiar con ese tipo de constantes es crear una Estructura.

struct Constants {
    static let someNotification = "TEST"
}

Entonces, por ejemplo, llámalo así en tu código:

print(Constants.someNotification)

Anidación

Si quieres una mejor organización te aconsejo que utilices subestructuras segmentadas.

struct K {
    struct NotificationKey {
        static let Welcome = "kWelcomeNotif"
    }

    struct Path {
        static let Documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        static let Tmp = NSTemporaryDirectory()
    }
}

Entonces puedes usar por ejemploK.Path.Tmp

Ejemplo del mundo real

Esto es sólo una solución técnica, la implementación real en mi código se parece más a:

struct GraphicColors {

    static let grayDark = UIColor(0.2)
    static let grayUltraDark = UIColor(0.1)

    static let brown  = UIColor(rgb: 126, 99, 89)
    // etc.
}

y


enum Env: String {
    case debug
    case testFlight
    case appStore
}

struct App {
    struct Folders {
        static let documents: NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
        static let temporary: NSString = NSTemporaryDirectory() as NSString
    }
    static let version: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    static let build: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

    // This is private because the use of 'appConfiguration' is preferred.
    private static let isTestFlight = Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"

    // This can be used to add debug statements.
    static var isDebug: Bool {
        #if DEBUG
        return true
        #else
        return false
        #endif
    }

    static var env: Env {
        if isDebug {
            return .debug
        } else if isTestFlight {
            return .testFlight
        } else {
            return .appStore
        }
    }
}
Francescu avatar Oct 08 '2014 08:10 Francescu

Llego un poco tarde a la fiesta.

No importa, aquí se explica cómo administro el archivo de constantes para que tenga más sentido para los desarrolladores mientras escribo código rápidamente.

PARA URL:

//URLConstants.swift

  struct APPURL {

    private struct Domains {
        static let Dev = "http://test-dev.cloudapp.net"
        static let UAT = "http://test-UAT.com"
        static let Local = "192.145.1.1"
        static let QA = "testAddress.qa.com"
    }

    private  struct Routes {
        static let Api = "/api/mobile"
    }

    private  static let Domain = Domains.Dev
    private  static let Route = Routes.Api
    private  static let BaseURL = Domain + Route

    static var FacebookLogin: String {
        return BaseURL  + "/auth/facebook"
    }
}

Para FUENTES PERSONALIZADAS:

//FontsConstants.swift
struct FontNames {

    static let LatoName = "Lato"
    struct Lato {
        static let LatoBold = "Lato-Bold"
        static let LatoMedium = "Lato-Medium"
        static let LatoRegular = "Lato-Regular"
        static let LatoExtraBold = "Lato-ExtraBold"
    }
}

PARA TODAS LAS LLAVES UTILIZADAS EN LA APLICACIÓN

//KeyConstants.swift
    struct Key {

        static let DeviceType = "iOS"
        struct Beacon{
            static let ONEXUUID = "xxxx-xxxx-xxxx-xxxx"
        }

        struct UserDefaults {
            static let k_App_Running_FirstTime = "userRunningAppFirstTime"
        }

        struct Headers {
            static let Authorization = "Authorization"
            static let ContentType = "Content-Type"
        }
        struct Google{
            static let placesKey = "some key here"//for photos
            static let serverKey = "some key here"
        }

        struct ErrorMessage{
            static let listNotFound = "ERROR_LIST_NOT_FOUND"
            static let validationError = "ERROR_VALIDATION"
        }
    }

PARA CONSTANTES DE COLOR:

//ColorConstants.swift
struct AppColor {

    private struct Alphas {
        static let Opaque = CGFloat(1)
        static let SemiOpaque = CGFloat(0.8)
        static let SemiTransparent = CGFloat(0.5)
        static let Transparent = CGFloat(0.3)
    }

    static let appPrimaryColor =  UIColor.white.withAlphaComponent(Alphas.SemiOpaque)
    static let appSecondaryColor =  UIColor.blue.withAlphaComponent(Alphas.Opaque)

    struct TextColors {
        static let Error = AppColor.appSecondaryColor
        static let Success = UIColor(red: 0.1303, green: 0.9915, blue: 0.0233, alpha: Alphas.Opaque) 
    }

    struct TabBarColors{
        static let Selected = UIColor.white
        static let NotSelected = UIColor.black
    }

    struct OverlayColor {
        static let SemiTransparentBlack = UIColor.black.withAlphaComponent(Alphas.Transparent)
        static let SemiOpaque = UIColor.black.withAlphaComponent(Alphas.SemiOpaque)
        static let demoOverlay = UIColor.black.withAlphaComponent(0.6)
    }
}

Puede agrupar todos estos archivos en un grupo común llamado Constantes en su proyecto Xcode.

Y para más mira este vídeo .

LC 웃 avatar Feb 25 '2017 16:02 LC 웃

Aunque prefiero el método de @Francescu (usando una estructura con propiedades estáticas), también puedes definir constantes y variables globales:

let someNotification = "TEST"

Sin embargo, tenga en cuenta que, a diferencia de las variables/constantes locales y las propiedades de clase/estructura, las variables globales son implícitamente diferidas, lo que significa que se inicializan cuando se accede a ellas por primera vez.

Lectura sugerida: Las variables globales y locales , y también las variables globales en Swift no son variables

Antonio avatar Oct 08 '2014 08:10 Antonio

Considere las enumeraciones. Estos se pueden dividir lógicamente para casos de uso separados.

enum UserDefaultsKeys: String {
    case SomeNotification = "aaaaNotification"
    case DeviceToken = "deviceToken"
}

enum PhotoMetaKeys: String {
    case Orientation = "orientation_hv"
    case Size = "size"
    case DateTaken = "date_taken"
}

Un beneficio único ocurre cuando tienes una situación de opciones mutuamente excluyentes, como por ejemplo:

for (key, value) in photoConfigurationFile {
    guard let key = PhotoMetaKeys(rawvalue: key) else {
        continue // invalid key, ignore it
    }
    switch (key) {
    case.Orientation: {
        photo.orientation = value
    }
    case.Size: {
        photo.size = value
    }
    }
}

En este ejemplo, recibirá un error de compilación porque no ha manejado el caso de PhotoMetaKeys.DateTaken.

William Entriken avatar Jan 14 '2016 04:01 William Entriken

Constante.rápido

import Foundation

let kBaseURL = NSURL(string: "http://www.example.com/")

ViewController.swift

var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
Kirit Vaghela avatar Apr 11 '2015 17:04 Kirit Vaghela