Ответ 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