CAGradientLayer上的Swift不调用类初始化方法

问题描述 投票:3回答:1

我有一个'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” @ ...

ios swift calayer cagradientlayer
1个回答
3
投票

全部涉及一个名为- (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.扩展)之外,则为类工厂方法。它还假定这与名称以相同方式构造的初始化程序有效相同,并完全隐藏了相应的工厂方法。

© www.soinside.com 2019 - 2024. All rights reserved.