ios - color - titletextattributes swift 4
swift: clase de tiempo de ejecución objetiva-c equivalente (3)
En Swift 3, self.dynamicType (y dynamicType en general) se ha eliminado.
Ahora usa:
type(of: self)
¿Qué es el código swift equivalente para el siguiente código de Objective-C? No pude encontrar el tema rápido con el concepto de tiempo de ejecución.
#import <objc/runtime.h>
Class class = [self class];
Tratando de obtener objeto de clase de self ?
Actualización: se intentó con el código siguiente, se obtuvo el error porque ''UIViewController.type'' doesn''t conform to protocol ''AnyObject''
var klass: AnyClass = object_getClass(self)
Nota: Encontré este post, pero no ayudó.
Primero, es difícil traducir ese código a Swift sin saber para qué usaste ese objeto de clase en Objective-C.
En Objective-C, los objetos de clase son objetos, y la Class tipo puede contener un puntero a cualquier objeto de clase. Sin embargo, cuando las API de Objective-C se conectan a Swift, el tipo de Class se convierte a AnyClass! en Swift, donde AnyClass se define como AnyObject.Type . Los tipos en Swift no son objetos, y por lo tanto no son directamente equivalentes a los objetos de clase en Objective-C. Sin embargo, si pretende utilizar una API de Objective-C de Swift, se habrá superado para esperar de cualquier AnyClass , por lo que debe pasar un tipo. Puedes obtener el tipo de expresión usando .dynamicType ; por ejemplo:
self.dynamicType
(Si realmente desea obtener el objeto de clase como un objeto Swift de la misma manera que en Objective-C, y no como un tipo Swift, también hay algunas formas complicadas de hacerlo).
Sin embargo, su descripción de su problema revela otro problema. Si solo desea obtener el tipo de un objeto, y self es un objeto, entonces var klass: AnyClass = object_getClass(self) debería haber funcionado, ya que object_getClass() toma un AnyObject y devuelve un AnyClass . La única explicación para que no funcione es si el self no es un objeto. Su mensaje de error revela que, de hecho, el self es un tipo , no un objeto.
self es un tipo si este código se ejecuta en un método de clase . Debería haber dado realmente contexto para su código (obviamente, no colocó Class class = [self class]; en el nivel superior de un archivo), porque fuera de contexto es fácil de malinterpretar. En Objective-C Cocoa, hay dos métodos muy diferentes denominados class : un método de instancia, -class , que devuelve la clase del objeto, y un método de clase, +class , que simplemente devuelve el objeto (clase) al que se llama. Dado que su código está en un método de clase, en Objective-C, self apunta a un objeto de clase, y [self class] ejecuta el método +class , que simplemente devuelve el objeto al que se llama. En otras palabras, [self class] es exactamente idéntico a self . Deberías haberte self escrito todo el tiempo, pero no te habías dado cuenta.
Así que la respuesta es que el Objective-C debería haber sido
Class class = self;
y de manera similar el Swift debería ser
var klass: AnyClass = self
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)