Ce qui est équivalent Swift code pour le code Objective-C ci-dessous. Je n'ai pas pu trouver Swift rubrique avec le concept d'exécution).
#import <objc/runtime.h>
Class class = [self class];
Vous essayez d'obtenir l'objet de classe de self
?
Mise à jour: Essayé avec le code ci-dessous, erreur comme 'UIViewController.type' doesn't conform to protocol 'AnyObject'
var klass: AnyClass = object_getClass(self)
Remarque: Trouvé ce message, mais n'a pas aidé.
Tout d'abord, il est difficile de traduire ce code en Swift sans savoir pourquoi vous avez utilisé cet objet de classe dans Objective-C.
Dans Objective-C, les objets de classe sont des objets et le type Class
peut contenir un pointeur sur n'importe quel objet de classe. Cependant, lorsque les API Objective-C sont pontées vers Swift, le type Class
est converti en AnyClass!
Dans Swift, où AnyClass
est défini comme AnyObject.Type
. Les types dans Swift ne sont pas des objets et ne sont donc pas directement équivalents aux objets de classe dans Objective-C. Cependant, si vous avez l'intention d'utiliser une API Objective-C de Swift, elle aura été pontée attendre AnyClass
de toute façon, vous devez donc passer un type. Vous pouvez obtenir le type de n'importe quelle expression en utilisant .dynamicType
; par exemple:
self.dynamicType
(Si vous voulez vraiment obtenir l'objet de classe en tant qu'objet Swift de la même manière qu'en Objective-C, et non en tant que type Swift, il y a certains façons compliquées de le faire aussi.)
Cependant, votre description de votre problème révèle un autre problème. Si vous voulez simplement obtenir le type d'un objet et que self
est un objet, alors var klass: AnyClass = object_getClass(self)
aurait dû fonctionner, puisque object_getClass()
prend un AnyObject
et renvoie un AnyClass
. La seule explication pour que cela ne fonctionne pas est si self
n'est pas un objet. Votre message d'erreur révèle qu'en effet, self
est un type , pas un objet.
self
est un type si ce code s'exécute dans une méthode de classe . Vous auriez dû vraiment donner du contexte à votre code (évidemment, vous n'avez pas mis Class class = [self class];
Au niveau supérieur d'un fichier), car sorti de son contexte, il est facile de se méprendre. Dans Objective-C Cocoa, il existe deux méthodes très différentes nommées class
: une méthode d'instance, -class
, Qui renvoie la classe de l'objet et une méthode de classe, +class
, qui renvoie simplement l'objet (classe) auquel il est appelé. Puisque votre code est dans une méthode de classe, dans Objective-C, self
pointe vers un objet de classe, et [self class]
Exécute la méthode de classe +class
, Qui renvoie simplement l'objet qu'il est appelé. En d'autres termes, [self class]
Est exactement identique à self
. Vous auriez dû écrire self
tout au long, mais vous ne vous en êtes pas rendu compte.
Donc, la réponse est que l'Objectif-C aurait dû être
Class class = self;
et de même, le Swift devrait être
var klass: AnyClass = self
Dans Swift 3, self.dynamicType
(et dynamicType
en général) a été supprimé.
Vous utilisez maintenant:
type(of: self)
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)