2009-05-16 25 views
13

Hola, pregunta rápida aquí. Estoy seguro de que hay una respuesta simple.Objective-C valor de argumento predeterminado

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

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

} 

que el parámetro de tipo no estaba llena, la función continuaría con el valor predeterminado false . En Obj-C, ¿hay algo similar?

Estoy trabajando en los ejercicios de mi libro "Programación en 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 el valor es TRUE para reducir se da, seguir y reducir la fracción, luego imprimir. El capítulo (Ni en ninguna parte del libro) brinda información sobre esto.

Gracias por su ayuda chicos: D

+0

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

Respuesta

1

No, los argumentos por defecto son una característica de C++, C o no Objective-C.

Lo que tendría que hacer en Objective-C es el siguiente (utilizando el código de pseudo arriba):

function myFunction ($array, $sort) 

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

realidad, no, no puedes hacer eso porque eso también es un C++ - ismo ... –

24

argumentos por defecto 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.

Los programadores de Objective-C logran un objetivo similar, creando 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 la versión de -[NSArray indexOfObject:inRange:] con un argumento de NSMakeRange(0, [self count]) para la parte inRange:.

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 reducirla si NO se proporciona.

9

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

(1) escribe una forma de muchos argumentos de un método y luego proporciona menos versiones convenientes de argumentos. Por ejemplo, considere los siguientes métodos de 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 tres primeros son conceptualmente [y probablemente concretamente, no el registro] implementan como llamadas a través de 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 establecerse 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, la NSData leerá el contenido del archivo usando una configuración por defecto definido internamente. Esa configuración predeterminada puede cambiar con el tiempo.

8

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

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

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

Solía (id) 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.

+0

Increíble, bastante inteligente. –

4

Necro terrible, pero para cualquiera que busque esto, Xcode 4.5 admite (a través de Clang) la sobrecarga de las funciones C con __attribute__((overloadable)).

Las funciones sobrecargadas pueden tener diferentes números de argumentos, por lo 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í está un ejemplo artificial de un archivo .h con dos funciones, ambos llamados 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 ser especificado en todas las definiciones y declaraciones de la función.

+0

gracias, me encantan estos consejos – xhan

0

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

Ejemplo:

Su función en el archivo de cabecera:

+ (NSDate *) getDateFromYear: (NSUInteger) mes del año: (NSUInteger) el día de mes: día (NSUInteger);

Añadir un '#define' para la función del parámetro en el archivo de cabecera:

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

Entonces su 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) year; Y llama: [auto getDateFromYear: mes año: 1 día: 1]

Cuestiones relacionadas