Подтвердить что ты не робот

Swift: эквивалентный objective-c класс выполнения

Что такое эквивалентный быстрый код для кода ниже Objective-C. Я не мог найти быструю тему с концепцией времени исполнения.

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

Попытка получить объект класса self?

Update: Пробовал с кодом ниже, получил ошибку как 'UIViewController.type' doesn't conform to protocol 'AnyObject'

var klass: AnyClass = object_getClass(self)

Примечание: Найдено этот пост, но не помогло.

4b9b3361

Ответ 1

Во-первых, трудно перевести этот код в Swift, не зная, что вы использовали для этого объекта класса в Objective-C.

В Objective-C объекты класса являются объектами, а тип Class может содержать указатель на любой объект класса. Однако, когда Objective-C API-интерфейсы соединяются с Swift, тип Class преобразуется в AnyClass! в Swift, где AnyClass определяется как AnyObject.Type. Типы в Swift не являются объектами и, следовательно, не являются непосредственно эквивалентными объектам класса в Objective-C. Однако, если вы намерены использовать API-интерфейс Objective-C от Swift, в любом случае он должен был ожидать AnyClass, поэтому вам нужно передать тип. Вы можете получить тип выражения с помощью .dynamicType; например:

self.dynamicType

(Если вы действительно хотите, чтобы объект класса был объектом Swift так же, как в Objective-C, а не как тип Swift, существуют некоторые запутанные пути сделать это тоже.)

Однако ваше описание проблемы выявляет еще одну проблему. Если вы просто хотите получить тип объекта, а self - объект, тогда var klass: AnyClass = object_getClass(self) должен работать, поскольку object_getClass() принимает AnyObject и возвращает AnyClass. Единственное объяснение этого не работает, если self не является объектом. Ваше сообщение об ошибке показывает, что, действительно, self - это тип, а не объект.

self - это тип, если этот код работает в методе класса. Вы должны действительно предоставить контекст для своего кода (очевидно, вы не поставили Class class = [self class]; на верхнем уровне файла), потому что из контекста легко понять неправильно. В Objective-C Cocoa существуют два очень разных метода с именем Class: метод экземпляра -class, который возвращает класс объекта и метод класса +class, который просто возвращает (класс ) объект, который он вызвал. Поскольку ваш код находится в методе класса, в Objective-C, self указывает объект класса, а [self class] запускает метод класса +class, который просто возвращает объект, на который он вызвал. Другими словами, [self class] точно совпадает с self. Вы должны были просто написать self все время, но не понимали этого.

Итак, ответ заключается в том, что Objective-C должен был быть

Class class = self;

и аналогичным образом Swift должен быть

var klass: AnyClass = self

Ответ 2

var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)

Ответ 3

В Swift 3, self.dynamicTypedynamicType в целом) был удален.

Теперь вы используете:

type(of: self)