2011-11-07 13 views
8

Wiem, że to pytanie zostało zadane kilka razy, ale moje jest nieco inne. Zanim zamkniesz ten plik jako duplikat, przeczytaj go w całości. Istnieje wiele wpisów na przepełnieniu stosu, które mówi: "Osobiście nienawidzę MAKRO, Nie używaj tego gówna". Czytałem te wszystkie, a mój przypadek jest inny. Próbuję zdefiniować adresy URL używane w oprogramowaniu (aplikacja na iOS) za pomocą makr #define.#define lub const string *

Zgadzam się, że używanie ciągów stałych jest lepszą praktyką niż makra #define. Jednak w świecie API opartym na REST, który akceptuje parametry zapytania jako część adresu URL, w jaki sposób można nadal używać ciągów stałych do reprezentowania zmieniającego się adresu URL?

Zamiast http://api.myblog.com/posts?entryid=%@ Server API REST, że następujące zasady miałyby http://api.blog.com/posts/entries/[entryid]

W pierwszym rodzaju, adres URL jest http://api.myblog.com/posts dla wszystkich pozycji i nie zmieniają. Ciąg stały był możliwy.

W drugim typie adres URL zmienia się wraz z każdym wpisem i używam makra, które rozwija się do pełnego adresu URL w ten sposób.

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

Czy są jakieś błędy konstrukcyjne w mojej metodzie? Chciałbyś poznać swoje dane wejściowe.

Dzięki.

Odpowiedz

4

Patrząc z perspektywy kompilatora, #define to dyrektywa preprocesora (patrz definicja w c, http://en.wikipedia.org/wiki/C_preprocessor).

W takim przypadku kompilator może wykonać cały zastępczy tekst przed skompilowaniem kodów.

np .: jeśli można zdefiniować:

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

mogłoby być zastąpienie co wystąpień GET_ENTRY_URL (x) [NSString ..., x] w swoich kodów. Potencjalnie instancje mogą być tworzone wszędzie tam, gdzie używamy makra, jeśli implementacja celu-c podąża za tym.

static const/variable wydaje się być lepszym sposobem.

+0

Jak przekazać zmienne statyczne nsstrings const? – Mugunth

+1

wiesz, że nie możesz, ponieważ jest stała. imho, jeśli api będzie bardziej skomplikowany, skonstruuję klasę jak NSURL, budowa URL-a może być wykonana wewnątrz. być może nie jest to jeszcze ważne, aby użyć makr lub nie, ale kiedy ten fragment kodu dotrze do wielu miejsc, wszystko może znowu być nie tak. np .: podziel wszystkie GET_ENTRY_URL (x) na dwa GET_CODING_ENTRY_URL (x), GET_PERSONAL_ENTRY_URL (x). – alvinsj

2

To, co zrobiłem w mojej aplikacji, to zdefiniowanie stałej dla ścieżki bazowej i stałej dla każdej konkretnej ścieżki z kodami formatu podstawienia wewnątrz ścieżki, gdy jest to konieczne.

NSString const *APIBasePath  = @"http://api.mydomain.com"; 
NSString const *APIEntryPath  = @"/entries/%d"; 
NSString const *APIUpdateEntryPath = @"/entries/%d/update"; 

I potem skonstruować URL w czasie wykonywania dla każdego API następująco:

- (void)updateEntryNumber:(NSUInteger)entryNumber 
{ 
    NSString *updateEntryPath = [NSString stringWithFormat:APIUpdateEntryPath, entryNumber]; 
    NSString *APIPath = [APIBasePath stringByAppendingPathComponent:updateEntryPath]; 
    // do something 
} 
+0

Właśnie znalazłem, że 'stringByAppendingPathComponent:' zwraca tylko jeden ukośnik, tj. 'Http:/...', wydaje się, że ta metoda jest używana dla ścieżki pliku, a nie adresu URL. Zamiast tego używam 'stringByAppendingString:'. :) – Kjuly