在我正在使用的第三方库中有一个UIView
子类(ALAlertBanner - 用Objective-C编写),我想在Swift中继承这个类,以便自定义它 - 让我们称之为MyAlertBanner
。
在Objective-C中,ALAlertBanner
的实例是使用如下的静态工厂方法创建的:
+ (ALAlertBanner *)alertBannerForView:(UIView *)view style:(ALAlertBannerStyle)style position:(ALAlertBannerPosition)position title:(NSString *)title;
...这些在Swift中被桥接到init()
方法,如下所示:
alertBanner = ALAlertBanner(forView: alertBannerView(),
style: ALAlertBannerStyleNotify,
position: ALAlertBannerPositionUnderNavBar,
title: title)
我可以毫不费力地在Swift中使用这些方法。
在MyAlertBanner
中,我将使用与桥接工厂方法相同的方法签名实现一个init方法,如下所示:
```init(forView:UIView,style:ALAlertBannerStyle,position:ALAlertBannerPosition,title:String,subtitle:String){ super.init(forView:forView,style:style,position:position,title:title,subtitle:subtitle)//编译错误
}
```
但是我收到编译错误:
Must call a designated initializer of the superclass 'ALAlertBanner'
我可以通过调用super.init(frame: CGRect)
来使编译器静音,但这意味着我的MyAlertBanner
实例未正确初始化 - 我需要使用所需参数调用完整的静态工厂方法。
有谁知道如何解决这个问题?有没有办法安抚Swift编译器并说“嘿 - 我知道我在这里做什么!”?
我一直在考虑的选项:
子类(不太理想,因为我试图尽可能地将这个绿地项目保留在Swift中以备将来的维护原因)
在Swift子类中创建一个静态工厂方法,但这不是非常惯用的Swift。