ios - name - viewport iphone
¿Cuál es el equivalente veloz a_cmd? (2)
No hay Swift equivalente de _cmd
. Hay pocas razones para usarlo en Swift.
Considere _cmd
en Objective-C. ¿Cuándo es útil? La mayoría de las veces, el valor de _cmd
sería el mismo que el nombre del método en el que se encuentra el código, por lo que ya se conoce en el momento de la compilación, y no es necesario un valor de tiempo de ejecución. Aquí hay algunos casos posibles cuando _cmd
es útil en Objective-C:
- En una macro. La macro se expande en el código, por lo que si
_cmd
aparece en la macro, entonces se inserta en la fuente donde se usa, y así el nombre del método se puede usar dentro de la macro. Sin embargo, tales macros no existen en Swift. Además, las macros son de tiempo de compilación, por lo que un mecanismo de tiempo de compilación como__FUNCTION__
funcionaría de manera similar. - Puede definir una función de C que toma
self
y_cmd
, y usarla (la misma función) como implementación de múltiples métodos, agregándola usandoclass_addMethod
yclass_replaceMethod
, y_cmd
dentro de la función ayudará a distinguir entre las diferentes llamadas de métodos. Sin embargo,class_addMethod
yclass_replaceMethod
no están disponibles en Swift. - El método swizzling es también un proceso que interfiere con la implementación de un método. Como en Swizzling intercambias las implementaciones de dos métodos,
_cmd
ayudará a revelar el nombre del método real utilizado en la llamada, que puede no coincidir con el método en el que se encuentra el código en el código fuente, ya que las implementaciones se intercambian. Supongo que el método swizzling todavía puede ser posible en Swift, ya quemethod_exchangeImplementations
todavía está disponible en Swift. Pero en el método swizzling, el método en el que se intercambia se adapta al método con el que se está intercambiando, por lo que si se llama, no existe ninguna ambigüedad con el nombre del método. - En el caso de que obtenga manualmente el
IMP
(función de implementación) de un método y lo llame manualmente con un selector diferente. En este caso, el interior de la función puede ver el selector diferente en_cmd
. Sin embargo, no tiene que preocuparse por esto en Swift porque los métodos que obtienen elIMP
no están disponibles.
Quiero obtener el nombre del método actual para usar en un mensaje de formato similar a este
[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
Además, quiero usar _cmd para establecer el objeto asociado. Aprecio cualquier idea.
NSStringFromSelector(_cmd); // Objective-C
print(__FUNCTION__) // Swift 2
print(#function) // Swift 3