2010-01-04 10 views
13

Solo me preguntaba si puede devolver dos argumentos en un método objetivo c, por ejemplo, me gustaría devolver una coordenada cartesiana (x, y), básicamente dos entradas. ¿Es la única forma de hacer esto creando una clase y devolviendo una instancia? ¿Hay alguna otra manera en la que no estoy pensando, algo así como un principiante aquí?¿Puedes devolver dos argumentos en Object-C?

(ayuda sintáctico también sería apreciada.)

Gracias,

Nick

Respuesta

32

Sólo puede volver un valor de una función (como C), pero el valor puede ser cualquier cosa, incluyendo una estructura. Y ya que se puede devolver una estructura por valor, se puede definir una función como esta (por tomar su ejemplo):

-(NSPoint)scalePoint:(NSPoint)pt by:(float)scale 
{ 
    return NSMakePoint(pt.x*scale, pt.y*scale); 
} 

Esto sólo es realmente apropiado para estructuras pequeñas/simples.

Si desea devolver más de un nuevo objeto, su función debe tener punteros al puntero del objeto, por lo tanto:

-(void)mungeFirst:(NSString**)stringOne andSecond:(NSString**)stringTwo 
{ 
    *stringOne = [NSString stringWithString:@"foo"]; 
    *stringTwo = [NSString stringWithString:@"baz"]; 
} 
+4

Y ahora con la introducción de Swift, puede devolver múltiples argumentos de funciones usando tuplas. Ver [El lenguaje de programación Swift] (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/index.html) para más detalles. – gavinb

+0

En Objective C, ¿cuál es la sintaxis para enviar punteros de primativos? Tales como BOOL o ints. Pensé que podría simplemente eliminar una estrella, pero esa no parece ser toda la historia que esperaba. –

+0

@RyanPoolos para tipos primitivos, es lo mismo que C. Simplemente pase la variable por referencia (por ejemplo, 'calc (int a, int b, int * c)') y actualice el valor en el cuerpo con '* c = a + b; '(por ejemplo). – gavinb

2

¿No podría hacer una NSArray para esto?

return [NSArray arrayWithObjects:coorX, coorY, nil]; 
+2

diccionarios funcionan mejor, porque no tiene que preocuparse por el orden de la misma manera que lo hace una matriz. –

+0

Sí, por lo general. Supongo que me estaba centrando demasiado en el ejemplo que dio el OP, ya que las coordenadas son siempre (* x *, * y *). –

+0

Gracias a todos por la visión, eso tiene sentido. Me está costando muchísimo tratar de descifrar este algoritmo en el que estoy trabajando. Gracias, Nick – nickthedude

3

Usted puede devolver un valor directamente y volver otro modo de referencia, como se se muestra en gs's answer, o crea un tipo de estructura y lo devuelve. Por ejemplo, Cocoa ya incluye un tipo para identificar puntos en un plano 2D, NSPoint.

1

Le recomiendo que devuelva un NSDictionary, dentro de Diccionario puede almacenar y enviar cualquier tipo de objeto y cualquier cantidad de variables.

-(NSDictionary*)calculateWith:(id)arg 
{ 
NSDictionary *urDictionary [email protected]{@"key1":value1,@"Key2":value2,.....}; 
return urDictionary; 
} 
Cuestiones relacionadas