Valore di argomento predefinito Objective-C

Ehilà, domanda veloce qui. Sono sicuro che c'è una risposta semplice.

Venendo da PHP, sono abituato a dichiarare una function con un valore di argomento predefinito come questo:

function myFunction ($arrays, $sort = FALSE) { } 

Se il parametro sort non è stato compilato, la function continuerà con il valore predefinito di false. In Obj-C, c'è una cosa simile?

Sto lavorando con gli esercizi del mio libro "Programming In Objective-C 2.0" e mi piacerebbe ri-scrivere una function di printing della class frazione in modo predefinito per non ridurre la frazione, ma se viene dato il valore VERO per riduci , vai avanti e riduci la frazione, quindi printing. Il capitolo (Niente da nessuna parte nel libro) fornisce informazioni su questo.

Grazie per il vostro aiuto ragazzi: D

Gli argomenti predefiniti non esistono in Objective-C, di per sé. Non possono realmente, perché il count degli argomenti è inestricabilmente legato al nome del metodo – each punto corrisponde a un argomento.

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

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

Ci sono due schemi standard per get quello che vuoi.

(1) scrivere una forma a più argomenti di un metodo e quindi fornire less versioni di convenienza degli argomenti. Ad esempio, considerare i seguenti methods su 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 concretamente, non ho verificato] implementati come 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 model consiste nell'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 methods che sono implementati con questo model. Per esempio:

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

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

Questa domanda è super vecchia, ma nel caso qualcuno la trovi, la versione Objective-C del codice PHP (supponendo che questo sia all'interno di una class) potrebbe essere qualcosa del genere:

 -(id)myFunction:(NSArray*)arrays { return [self myFunction:arrays withSort:FALSE]; } -(id)myFunction:(NSArray*)arrays withSort:(BOOL)useSort { // CODE } 

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

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

Le funzioni sovraccaricate possono avere un numero diverso di argomenti, quindi se le funzioni C sono appropriate per quello che stai cercando di fare puoi usarlo per get valori di argomento predefiniti.

Ecco un esempio PrintNum 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) { // ... } 

Si noti che l'attributo deve essere specificato in tutte le definizioni e dichiarazioni della function.

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

Quello che dovresti fare in ogg-c è il seguente (usando il tuo codice psuedo sopra):

 function myFunction ($arrays, $sort) function myFunction ($arrays) // call myFunction($arrays, FALSE) 

Puoi facilmente get lo stesso effetto usando #define.

Esempio:

La tua function nel file di intestazione:

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

Aggiungi un '#define' per la function parametro nel file di intestazione:

#define GetDateFromYearOnly (year) [YourClassName getDateFromYear: year month: 1 day: 1]

Quindi puoi utilizzare la function come: NSDate * 2015Date = GetDateFromYearOnly (2015);

E riceverai un object NSDate con data 2015/01/01.

Se la function non è statica, creare una nuova function come: – (NSDate *) GetDateFromYearOnly: (NSUInteger) anno; E chiama: [self getDateFromYear: year month: 1 day: 1]