Вы можете использовать [Rectangle class]
, чтобы проверить, является ли объект является экземпляром Rectangle
(или экземпляром подкласса Rectangle
):
if ([object isKindOfClass:[Rectangle class]]) {
Rectangle *rect = (Rectangle *)object;
// ... use rect
}
Но если у вас есть только одно сообщение для отправки, возможно, было бы лучше проверить, понимает ли объект сообщение, которое вы хотите отправить:
if ([object respondsToSelector:@selector(area)]) {
double area = [object area];
// etc.
}
Вы можете использовать объект класса для создания экземпляра класса:
Class rectangleClass = [Rectangle class];
Rectangle *rectangle = [[rectangleClass alloc] init];
Почему вы хотите сделать это? Ну, если вы знаете класс явно в месте (в вашем коде), где вы хотите его создать, вы бы этого не сделали. Например, вы просто скажете [[Rectangle alloc] init]
.
Но рассмотрите UIView
. Каждый UIView
создает и управляет CALayer
. По умолчанию он создает экземпляр CALayer
, но вместо этого вы можете использовать в своем окне CAShapeLayer
(example) или CAGradientLayer
(example). Вам нужно указать UIView
, чтобы создать экземпляр другого класса.
Вы можете сказать своему UIView
подкласс, какой слой, чтобы создать путем переопределения the layerClass
class method:
@implementation MyShapeView
+ (Class)layerClass {
return [CAShapeLayer class];
}
Когда пришло время для MyShapeView
создать свой слой, он будет отправить себе layerClass
и создать экземпляр независимо класс возвращается. Код, вероятно, выглядит примерно так:
@implementation UIView {
CALayer *_layer;
}
- (CALayer *)layer {
if (_layer == nil) {
_layer = [[[self layerClass] alloc] init];
_layer.delegate = self;
}
return _layer;
}
Спасибо! Таким образом, [Rectangle class] возвращает класс «Rectangle»? Или он создает новый класс под названием Rectangle? Если первое, в чем разница между высказыванием [Класс прямоугольника} и только Rectangle? И что вы подразумеваете под «объектом класса»? –
И наконец, что именно вы здесь делаете: 'Класс rectangleClass = [Rectangle class]; Прямоугольник * прямоугольник = [[rectangleClass alloc] init]; ' Почему это не так: ' Класс rectangleClass = [Rectangle class]; Прямоугольник * прямоугольник = [[Прямоугольник] init]; ' Что такое rectangleClass? –
'[Rectangle class]' возвращает объект, представляющий класс 'Rectangle'. Если вы будете называть его повторно, вы будете получать тот же объект каждый раз.Говоря '[[rectangleClass alloc] init]', вы позволяете изменять класс во время выполнения, а не фиксироваться во время компиляции. Поскольку 'rectangleClass' является переменной, ему может быть назначен другой объект класса (предположительно, объект класса, представляющий подкласс' Rectangle'). –