2009-05-16 28 views
13

Ehilà, domanda veloce qui. Sono sicuro che c'è una risposta semplice.Valore argomento Objective-C predefinito

Venendo da PHP, io sono abituato a dichiarare una funzione con un valore di argomento di default in questo modo:

function myFunction ($array, $sort = FALSE) { 

} 

io, il parametro di ordinamento non è piena, la funzione avrebbe continuato con il valore predefinito false . In Obj-C, c'è una cosa simile?

Sto lavorando con gli esercizi del mio libro "Programming In Objective-C 2.0" e desidero che io scriva di nuovo una funzione di stampa della classe frazione in modo predefinito per non ridurre la frazione, ma se il valore VERO per ridurre è dato, andare avanti e ridurre la frazione, quindi stampare. Il capitolo (Niente da nessuna parte nel libro) fornisce informazioni su questo.

Grazie per il vostro aiuto ragazzi: D

+0

duplicato: http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c-2-0 –

risposta

1

No, gli argomenti di default sono una caratteristica di C++, non C o Objective-C.

Che cosa si dovrebbe fare in Objective-C è il seguente (utilizzando il codice pseudo sopra):

function myFunction ($array, $sort) 

function myFunction ($array) 
// call myFunction($array, FALSE) 
+0

in realtà, no non puoi farlo perché è anche un C++ - ism ... –

24

argomenti di default non esistono in Objective-C, di per sé. Non possono realmente, perché il conteggio degli argomenti è inestricabilmente legato al nome del metodo - ogni punto corrisponde a un argomento.

I programmatori Objective-C raggiungono un obiettivo simile, tuttavia, creando metodi di "convenienza" che richiamano semplicemente un metodo più "primitivo" con alcuni degli argomenti riempiti con valori predefiniti. Ad esempio, -[NSArray indexOfObject:] potrebbe essere implementato come versione di -[NSArray indexOfObject:inRange:] con un argomento di NSMakeRange(0, [self count]) per la parte inRange:.

In questo caso, tuttavia, non penso che il tuo libro stia parlando di questo. Penso che significhi semplicemente ridurre la frazione se SÌ è dato per l'argomento reduce: e non ridurlo se NO è dato.

9

Esistono due schemi standard per ottenere ciò che si desidera.

(1) scrivere una forma a più argomenti di un metodo e quindi fornire meno versioni di argomento di convenienza. Ad esempio, considerare i seguenti metodi di NSString:

- (NSComparisonResult)compare:(NSString *)string; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange locale:(id)locale; 

I primi tre sono concettualmente [e probabilmente in concreto, non ho controllato] implementato come le chiamate fino alla quarta versione. Questo è -compare: chiamate -compare: opzioni: intervallo: locale: con i valori predefiniti appropriati per i tre argomenti aggiuntivi.

(2) L'altro modello è quello di implementare la versione a molti argomenti del metodo e fornire valori predefiniti quando un argomento è NULL/nil o impostato su un valore che indica che l'impostazione predefinita è desiderata. NSData ha metodi che sono implementati con questo modello. Per esempio:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask 
      error:(NSError **)errorPtr; 

Se si passa 0 per l'argomento readOptionsMask, il NSData leggerà il contenuto del file usando una configurazione di default definito internamente. Quella configurazione di default può cambiare nel tempo.

8

Questa domanda è super vecchio, ma nel caso qualcuno lo trova, la versione Objective-C del codice PHP (supponendo che questo è all'interno di una classe) probabilmente sarebbe qualcosa di simile:

-(id)myFunction:(NSArray*)array { 
    return [self myFunction:array withSort:FALSE]; 
} 

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort { 
    // CODE 
} 

ho usato (id) s dato che non ci sono informazioni sul tipo di dati nel codice PHP. Sostituire i (id) con tipi di dati effettivi sarebbe saggio.

+0

Fantastico, abbastanza intelligente però. –

4

Necro terribile ma per chiunque lo chiami, Xcode 4.5 supporta (via Clang) l'overloading delle funzioni C con __attribute__((overloadable)).

Le funzioni di overload sono consentite per avere diversi numeri di argomenti, quindi se le funzioni C sono appropriate per ciò che si sta tentando di fare, è possibile utilizzarle per ottenere valori di argomenti predefiniti.

Ecco un esempio forzato di un file .h con due funzioni, entrambi chiamati PrintNum:

// Prints a number in the decimal base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number); 

// Prints a number in the specified base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number, NSUInteger base); 

e nel file .m:

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) { 
    PrintNum(number, 10); 
} 

__attribute__((overloadable)) 
void PrintNum(NSNumber *number, NSUInteger base) { 
    // ... 
} 

Nota che l'attributo deve essere specificato in tutte le definizioni e le dichiarazioni della funzione.

+0

grazie, adoro questi suggerimenti – xhan

0

È possibile ottenere facilmente lo stesso effetto utilizzando #define.

Esempio:

La vostra funzione nel file di intestazione:

+ (NSDate *) getDateFromYear: (NSUInteger) mese anno: (NSUInteger) giorno mese: (NSUInteger) giorno;

Aggiungere un '#define' per la funzione parametro nel file di intestazione:

#define GetDateFromYearOnly (anno) [YourClassName getDateFromYear: mese anno: 1 giorno: 1]

Allora il tuo possibile utilizzare la funzione come : NSDate * 2015Date = GetDateFromYearOnly (2015);

E si riceverà un oggetto NSDate con data 2015/01/01.

Se la funzione non è statica, creare una nuova funzione come: - (NSDate *) GetDateFromYearOnly: (NSUInteger) anno; E non chiamate: [auto getDateFromYear: mese anno: 1 giorno: 1]

Problemi correlati