webapp name icon for capable apple app ios objective-c swift selector

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 usando class_addMethod y class_replaceMethod , y _cmd dentro de la función ayudará a distinguir entre las diferentes llamadas de métodos. Sin embargo, class_addMethod y class_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 que method_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 el IMP 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