У меня есть подкласс Objective- C класса CAGradientLayer, который переопределяет инициализатор слоя + (CAGradientLayer *). Он правильно включен в мой Bridging-Header
#import "ONCGradientLayer.h"
@implementation ONCGradientLayer
+ (ONCGradientLayer *)gradientLayer {
return [ONCGradientLayer layer];
}
+ (ONCGradientLayer *)layer {
ONCGradientLayer * layer = [super layer];
layer.colors = @[(id)[[UIColor colorWithWhite:0.0 alpha:1] CGColor], (id)[[UIColor colorWithWhite:0.1 alpha:1] CGColor]];
layer.startPoint = CGPointMake(0, 0);
layer.endPoint = CGPointMake(0, 1);
return layer;
}
Это все работает, как и ожидалось от Objective- C, вызывая либо [ONCGradientLayer layer]
, либо [ONCGradientLayer gradientLayer]
Когда я пытаюсь вызовите его из swift, я получил предупреждение компилятора о том, что метод был переименован в init
, поэтому я должен вызвать ONCGradientLayer()
Это, однако, не работает, и переопределенный инициализатор никогда не вызывается.
Я могу обойти это, добавив инициализатор с другим именем:
+ (ONCGradientLayer *)swiftInit {
return [ONCGradientLayer layer];
}
Я могу успешно вызвать это в swift, используя ONCGradientLayer.swiftInit()
Что происходит, что мешает мне позвонить ONCGradientLayer()
и получить переопределенный инициализатор?
ОБНОВЛЕНИЕ: я могу заставить ONCGradientLayer()
работать, реорганизовав его для использования метода init
, хотя мне все еще любопытно, почему другой подход не работает.
- (instancetype)init {
if (self = [super init]) {
self.colors = @[(id)[DEFAULT_BACKGROUND_COLOR CGColor], (id)[[UIColor colorWithWhite:.1 alpha:1] CGColor]];
self.startPoint = CGPointMake(0, 0);
self.endPoint = CGPointMake(0, 1);
}
return self;
}