Ando analizando y considerando el establecer un "puente" desde PRG a Objective-C que tal vez pueda ser más cómodo que construir todo desde Objective-C.
La idea es rutar los mensajes enviados a un objeto desde PRG a sus correspondientes mensajes en Objective-C. Veo ventajas e inconvenientes, por eso voy a comentar lo que he visto y asi lo analizamos entre todos
Para enviar un mensaje a un objeto en Objective-C se usa un "selector". La clave está en que podemos construir un selector a partir de una cadena:
- Code: Select all Expand view
SEL Selector = NSSelectorFromString( @"Mensaje:"); // Ojo que hay que especificar ":" al final del nombre del mensaje
Pasando varios parámetros al mensaje:
- Code: Select all Expand view
SEL Selector = NSSelectorFromString(@"MyMethod:AndSecondValue:");
[self performSelector:Selector withObject:@"My String" withObject:[NSNumber numberWithInt:10]];
Asi, podriamos rutar el mensaje enviado a un objeto (usando ON ERROR) en nivel PRG y generar un selector en Objective-C. Además podemos comprobar si el objeto en Objective-C soporta ó no dicho mensaje:
- Code: Select all Expand view
- (void) forwardInvocation: (NSInvocation*)anInvocation
{
if ([anObject respondsToSelector: [anInvocation selector]])
return [anInvocation invokeWithTarget: anObject];
else
return [self doesNotRecognizeSelector: [anInvocation selector]];
}
En este código entra en juego un nuevo elemento, la clase NSInvocation, que permite controlar parámetros, valor de retorno, objeto al que se envia el mensaje.
Las pegas que le veo es que desde PRG solo disponemos de un número muy límitado de "tipos". Asi que necesitariamos usar funciones que creasen los tipos extra que hiciesen falta.
La idea es crear una Clase NSObject que guardaría el handle del objeto Objective-C y que podria usarse algo así:
- Code: Select all Expand view
local oWnd := NSObject():New( UIWindowAllocInit() )
oWnd:setBackgroundColor = ...
// que se traduciría a:
[ hObj setBackgroundColor : ... ]; // oWnd:hObj en PRG
Bueno, aqui tenemos este camino. Tal vez podemos implementarlo como algo adicional a lo que ya tenemos...