Swift中的子类不会inheritance它的父类的初始化

当我尝试子类化NSBezierPath时,我偶然发现了一个非常奇怪的问题。

以下是我的子类的定义:

 class OSBezierPath: NSBezierPath { func addLineToPoint(point:CGPoint) { self.lineToPoint(point) } } 

除了我无法访问NSBezierPath一些初始化程序这个事实之外,这个子类还是NSBezierPath 。 例如,下面的行是无效的:

 let path = OSBezierPath(ovalInRect: rect) 

编译器引发错误

在调用中额外的参数“ovalInRect”

这个错误的原因

这个错误的原因在另一个问题中得到了很好的解释。 然而,build议的答案不适合我,因为我试图实现的是在iOS和Mac OS上使用OSBezierPath

我原来的代码是这样读的:

 #if os(iOS) typealias OSBezierPath = UIBezierPath #else class OSBezierPath: NSBezierPath { func addLineToPoint(point:CGPoint) { self.lineToPoint(point) } } #endif 

这个代码不起作用,但是我发现了两个解决方法,比我们在另一个问题中提出的答案更优雅。

第一个scheme

这个解决scheme使用扩展将一个函数添加到NSBezierPath ,这将允许它以与UIBezierPath相同的方式画线。

 #if os(iOS) typealias OSBezierPath = UIBezierPath #else typealias OSBezierPath = NSBezierPath extension OSBezierPath { func addLineToPoint(point:CGPoint) { self.lineToPoint(point) } } #endif 

这避免了任何潜在的错误,因为不涉及子类。 因此,行:

 let path = OSBezierPath(ovalInRect: rect) 

实际上转化为:

 let path = NSBezierPath(ovalInRect: rect) 

所以编译器很高兴:)

第二个解决scheme(Xcode 7)

第二个解决scheme使用UIBezierPath类函数在Xcode 7中转换为合适的初始化程序。因此,以下代码将起作用:

 #if os(iOS) class OSBezierPath: UIBezierPath { func lineToPoint(point:CGPoint) { self.addLineToPoint(point) } } #else typealias OSBezierPath = NSBezierPath #endif 

这使我们可以通过在iOS和Mac OS上调用lineToPoint来使用OSBezierPath