web-dev-qa-db-fra.com

Comment # définir une chaîne NSString pour une utilisation mondiale?

Je suis nouveau sur Objective-C. Essentiellement, je veux stocker un ensemble d'URL de point de terminaison sous forme de chaînes à utiliser dans mon application, mais j'ai besoin d'un domaine différent selon que l'application est en mode DEBUG ou non. J'ai pensé qu'il pourrait être utile d'utiliser un fichier d'en-tête (Common.h par exemple) avec quelques définitions simples comme ceci:

#ifdef DEBUG
    #define kAPIEndpointHost @"http://example.dev"
#else
    #define kAPIEndpointHost @"http://www.example.com"
#endif

#define kAPIEndpointLatest          [kAPIEndpointHost stringByAppendingString:@"/api/latest_content"]
#define kAPIEndpointMostPopular     [kAPIEndpointHost stringByAppendingString:@"/api/most_popular"]

Évidemment, cela ne fonctionne pas car vous ne pouvez pas baser une constante sur la valeur d'une autre constante apparemment.

Quelle est la "bonne" façon de procéder? Serait-il plus logique d'avoir une classe appropriée avec des méthodes de classe qui renvoient les valeurs de point de terminaison correctes?

EDIT: Juste pour être clair, les chaînes "Latest" et "MostPopular" qui sont basées sur la chaîne Host sont ce que J'ai le plus de mal avec. Le compilateur n'aime pas la partie stringByAppendingString des #defines.

31
markquezada

Si vous concaténez simplement des chaînes, vous pouvez utiliser la concaténation de chaîne de temps de compilation:

#ifdef DEBUG
    #define kAPIEndpointHost @"http://example.dev"
#else
    #define kAPIEndpointHost @"http://www.example.com"
#endif

#define kAPIEndpointLatest          (kAPIEndpointHost @"/api/latest_content")
#define kAPIEndpointMostPopular     (kAPIEndpointHost @"/api/most_popular")
64
cobbal

Je n'aime pas utiliser #defines pour les constantes de chaîne. Si vous voulez des constantes globales et une concaténation de temps de compilation. J'utiliserais ce qui suit:

En tête de fichier:

extern NSString *const kAPIEndpointHost;
extern NSString *const kAPIEndpointLatestPath;
extern NSString *const kAPIEndpointMostPopularPath;

Fichier d'implémentation:

#ifdef DEBUG
#define API_ENDPOINT_Host @"http://example.dev"
#else
#define API_ENDPOINT_Host @"http://www.example.com"
#endif

NSString *const kAPIEndpointHost = API_ENDPOINT_Host;
NSString *const kAPIEndpointLatestPath = (API_ENDPOINT_Host @"/api/latest_content");
NSString *const kAPIEndpointMostPopularPath = (API_ENDPOINT_Host @"/api/most_popular");
19
Eric

Dans votre fichier d'en-tête:

extern NSString *const kAPIEndpointHost;
extern NSString *const kAPIEndpointLatestPath;
extern NSString *const kAPIEndpointMostPopularPath;

Dans votre fichier d'implémentation:

#ifdef DEBUG
    NSString *const kAPIEndpointHost = @"http://example.dev";
#else
    NSString *const kAPIEndpointHost = @"http://www.example.com";
#endif

NSString *const kAPIEndpointLatestPath = @"/api/latest_content";
NSString *const kAPIEndpointMostPopularPath = @"/api/most_popular";
11
Black Frog