swift: objectif équivalent-classe d'exécution c

Qu'est-ce que le code swift équivalent pour le code ci-dessous objectif-C. Je n'ai pas trouvé de sujet swift avec le concept runtime.

#import <objc/runtime.h>    
Class class = [self class];

essayer d'obtenir l'objet de classe de self ?

mise à Jour: Essayé avec le code ci-dessous, a obtenu l'erreur comme 'UIViewController.type' doesn't conform to protocol 'AnyObject'

var klass: AnyClass = object_getClass(self)

Note: Trouvé ce post, mais ne serait pas aidé.

27
demandé sur Community 2014-06-25 12:27:54

3 réponses

Premièrement, il est difficile de traduire ce code en Swift sans savoir ce que vous avez utilisé cet objet de classe dans objectif-C.

dans Objectif-C, les objets de classe sont des objets, et le type Class peut contenir un pointeur vers n'importe quel objet de classe. Toutefois, lorsque les IPA-objectifs sont pontés à Swift, le type Class est converti en AnyClass! dans Swift, où AnyClass est défini comme AnyObject.Type . Types de Swift ne sont pas des objets, et ne sont donc pas directement équivalent aux objets de classe dans L'objectif-C. Cependant, si vous avez l'intention d'utiliser une API Objectif-C de Swift, il aura été ponté à attendre AnyClass de toute façon, donc vous devez 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 comme un objet Swift de la même manière qu'en Objectif-C, et pas comme un type Swift, il y a quelques façons alambiquées pour faire cela trop.)

Cependant, votre description de votre problème révèle un autre problème. Si vous voulez juste obtenir le type d'un objet, et self est un objet, alors var klass: AnyClass = object_getClass(self) aurait dû fonctionner, puisque object_getClass() prend un AnyObject et retourne un AnyClass . La seule explication pour cela ne fonctionne pas est si self est pas un objet. Votre message d'erreur révèle que, en effet, self est un type , pas un objet.

self est un type si ce code est utilisé dans une "méthode de classe . Vous auriez dû vraiment donner le contexte de votre code (évidemment, vous n'avez pas mis Class class = [self class]; au niveau supérieur d'un fichier), parce que hors contexte il est facile de se méprendre. Dans objectif-c cacao, il ya deux méthodes très différentes appelées class : une instance méthode, -class , qui renvoie la classe de la objet et une méthode de classe, +class , qui renvoie simplement l' (catégorie) objet, 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 sur lequel il est appelé. En d'autres termes, [self class] est exactement identique à self . Tu aurais dû écrire self depuis le début, mais tu ne t'en es 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
44
répondu newacct 2017-05-23 12:17:55
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
4
répondu mientus 2014-06-25 08:58:19

dans Swift 3, self.dynamicType (et dynamicType en général) a été supprimé.

vous utilisez maintenant:

type(of: self)
4
répondu Dafydd Williams 2017-05-05 01:44:09