web-dev-qa-db-fra.com

swift: classe d'exécution objective-c équivalente

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é.

33
Mani

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
49
newacct

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

Vous utilisez maintenant:

type(of: self)
7
Dafydd Williams
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
5
mientus