Valor de argumento predeterminado de Objective-C

Hola, pregunta rápida aquí. Estoy seguro de que hay una respuesta simple.

Viniendo de PHP, estoy acostumbrado a declarar una función con un valor de argumento predeterminado como este:

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

Si el parámetro de clasificación no se llenó, la función continuará con el valor predeterminado de falso. En Obj-C, ¿hay algo similar?

Estoy trabajando en los ejercicios de mi libro “Programming In Objective-C 2.0”, y quiere que vuelva a escribir una función de impresión de clase de fracción para no reducir la fracción, pero si se da el valor TRUE for reduce , siga adelante y reduzca la fracción, luego imprima. El capítulo (Ni en ninguna parte del libro) brinda información sobre esto.

Gracias por su ayuda muchachos: D

Los argumentos predeterminados no existen en Objective-C, per se. Realmente no pueden, porque el recuento de argumentos está inextricablemente ligado al nombre del método: cada dos puntos corresponde a un argumento.

Sin embargo, los progtwigdores de Objective-C logran un objective similar al crear métodos de “conveniencia” que simplemente llaman a un método más “primitivo” con algunos de los argumentos rellenos con valores predeterminados. Por ejemplo, -[NSArray indexOfObject:] podría implementarse como versión de -[NSArray indexOfObject:inRange:] con un argumento de NSMakeRange(0, [self count]) para inRange: part.

En este caso, sin embargo, no creo que su libro esté hablando de eso. Creo que simplemente significa reducir la fracción si se da SÍ para el argumento reduce: y no reducirlo si NO se da.

Hay dos patrones estándar para lograr lo que desea.

(1) escriba una forma de muchos argumentos de un método y luego proporcione menos versiones de argumentos de conveniencia. Por ejemplo, considere los siguientes métodos en 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; 

Los primeros tres son conceptualmente [y probablemente concretamente, no controlé] implementados como llamadas hasta la cuarta versión. Eso, es -compare: llamadas -compare: options: range: locale: con valores predeterminados apropiados para los tres argumentos adicionales.

(2) El otro patrón es implementar la versión de muchos argumentos del método y proporcionar valores predeterminados cuando un argumento es NULL / nil o se establece en algún valor que indique que se desea el valor predeterminado. NSData tiene métodos que se implementan con este patrón. Por ejemplo:

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

Si pasa 0 para el argumento readOptionsMask, NSData leerá el contenido del archivo utilizando una configuración predeterminada definida internamente. Esa configuración predeterminada puede cambiar con el tiempo.

Esta pregunta es muy antigua, pero en caso de que alguien la encuentre, la versión Objective-C del código PHP (suponiendo que esté dentro de una clase) probablemente sea algo como esto:

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

Usé (id) s ya que no hay información de tipo de datos en su código PHP. Reemplazar los (id) s con tipos de datos reales sería sabio.

Necro terrible pero para cualquier persona que busque en Google esto, Xcode 4.5 soporta (a través de Clang ) la sobrecarga de funciones C con __attribute__((overloadable)) .

Las funciones sobrecargadas pueden tener diferentes números de argumentos, de modo que si las funciones C son apropiadas para lo que estás tratando de hacer, puedes usar eso para obtener valores de argumento predeterminados.

Aquí hay un ejemplo artificial de un archivo .h con dos funciones, ambas llamadas 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); 

y en el archivo .m:

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

Tenga en cuenta que el atributo debe especificarse en todas las definiciones y declaraciones de la función.

No, los argumentos predeterminados son una característica de C ++, no C u Objective-C.

Lo que tendría que hacer en objective-c es el siguiente (usando su código psuedo arriba):

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

Puede lograr el mismo efecto fácilmente usando #define.

Ejemplo:

Su función en el archivo de encabezado:

+ (NSDate *) getDateFromYear: (NSUInteger) mes anual: (NSUInteger) mes día: (NSUInteger) día;

Agregue un ‘#define’ para la función de parámetro en el archivo de encabezado:

#define GetDateFromYearOnly (año) [YourClassName getDateFromYear: mes anual: 1 día: 1]

Entonces puede usar la función como: NSDate * 2015Date = GetDateFromYearOnly (2015);

Y obtendrá un objeto NSDate con fecha 01/01/2015.

Si la función no es estática, cree una nueva función como: – (NSDate *) GetDateFromYearOnly: (NSUInteger) año; Y llame: [self getDateFromYear: mes del año: 1 día: 1]