#define ou const string*
Je sais que cette question a été posée plusieurs fois, mais la mienne est un peu différente. Avant de clôturer ce que les doublons, merci de la lire entièrement.
Il y a beaucoup de posts sur stack overflow qui dit, "Personnellement, je déteste les MACROS, N'utilisez pas que de la merde". J'ai lu tous ceux et mon cas est différent. Je suis en train de définir les Url utilisées dans un logiciel (iOS app) à l'aide de #définir des macros.
Je suis d'accord que l'utilisation de const cordes est une meilleure pratique de #définir des macros. Mais de plus en plus d'API REST monde qui accepte les paramètres de la requête comme une partie de l'URL, comment pouvez-vous continuer à utiliser const chaînes de caractères pour représenter une URL qui change?
Au lieu de http://api.myblog.com/posts?entryid=%@
une API Serveur de REPOS après les principes aurait
http://api.blog.com/posts/entries/[entryid]
Dans le premier type, l'URL est http://api.myblog.com/posts pour toutes les entrées et ils ne changent pas. Const string était possible.
Dans ce dernier type, l'URL change avec chaque entrée et j'utilise une Macro qui se développe à une URL complète de ce genre.
#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__];
Il des défauts dans la conception de ma méthode?
Voudrais savoir vos entrées.
Grâce.
OriginalL'auteur Mugunth | 2011-11-07
Vous devez vous connecter pour publier un commentaire.
À la recherche du point de vue du compilateur, #define est une directive de préprocesseur (se reporter à la définition de c, http://en.wikipedia.org/wiki/C_preprocessor).
Dans ce cas, le compilateur peut-être de l'ensemble de remplacement de texte avant de compiler vos codes.
par exemple: si vous définissez:
elle pourrait remplacer toutes les occurrences de GET_ENTRY_URL(x) avec [NSString ..., x] dans vos codes. Potentiellement, les instances peuvent être créés partout où nous utilisons de la macro si la mise en œuvre de l'objective-c est suite à cette.
static const/variable semble être une meilleure façon.
vous savez que vous ne pouvez pas, car il est une constante. à mon humble avis, si l'api devient plus compliqué, je vais construire la classe comme un NSURL , la construction d'une url qui peut être fait à l'intérieur. c'est peut-être pas d'importance encore à l'utilisation de la macro ou pas, mais quand ce morceau de codes obtient de nombreux endroits, les choses pourraient se sentir mal à nouveau. par exemple: diviser tous les GET_ENTRY_URL(x) en deux GET_CODING_ENTRY_URL(x), GET_PERSONAL_ENTRY_URL(x).
OriginalL'auteur alvinsj
Ce que j'ai fait dans mon application a été de définir un const pour le chemin d'accès de base et un const pour chaque chemin d'accès spécifique à une substitution format de codes à l'intérieur du chemin lorsque cela est nécessaire.
Je puis construire l'URL au moment de l'exécution pour chaque API comme suit:
stringByAppendingPathComponent:
ne renvoie qu'un seul slash, c'est à direhttp:/...
, il semble que cette méthode est utilisée pour le chemin d'accès au fichier, pas d'url. Au lieu de cela, j'utilisestringByAppendingString:
. 🙂OriginalL'auteur XJones