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)