titletextattributes color bar ios swift objective-c-runtime

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)