我有一个'CAGradientLayer'的Objective-C子类,它覆盖了'+(CAGradientLayer *)layer'初始化程序。它已正确包含在我的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;
}
这一切都可以通过调用[ONCGradientLayer layer]
或[ONCGradientLayer gradientLayer]
来达到Objective-C的预期效果>
[当我尝试快速调用它时,我收到编译器警告,该方法已重命名为init
,因此我必须调用ONCGradientLayer()
。但是,此方法无效,并且永远不会调用覆盖的初始化程序。
我可以通过添加一个不同名称的初始化程序来解决此问题:
+ (ONCGradientLayer *)swiftInit { return [ONCGradientLayer layer]; }
我可以使用
ONCGradientLayer.swiftInit()
快速成功地调用它
发生了什么事情使我无法调用ONCGradientLayer()
并获取被覆盖的初始化程序?
更新:我可以通过重构它以使用ONCGradientLayer()
方法来使它工作,尽管我仍然很好奇为什么其他方法不起作用。
init
我有一个'CAGradientLayer'的Objective-C子类,它覆盖了'+(CAGradientLayer *)layer'初始化程序。它已正确包含在我的Bridging-Header #import“ ONCGradientLayer.h” @ ...
全部涉及一个名为- (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;
}
的Swift组件,它负责将Objective-C方法名称转换为Swift方法名称(反之亦然。)>
[Clang导入程序假定,如果Objective C类具有与该类相同名称的类方法,除了前缀(可能由Clang Importer.扩展)之外,则为类工厂方法。它还假定这与名称以相同方式构造的初始化程序有效相同,并完全隐藏了相应的工厂方法。