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
。