在尝试子类化NSBezierPath
时,我偶然发现了一个非常奇怪的问题。
以下是我的子类的定义:
class OSBezierPath: NSBezierPath {
func addLineToPoint(point:CGPoint) {
self.lineToPoint(point)
}
}
这个子类与我无法访问NSBezierPath
的某些初始化者的事实不同。例如,下面的行无效:
let path = OSBezierPath(ovalInRect: rect)
编译器抛出错误
调用中的额外参数'ovalInRect'
another question中详细解释了此错误的原因。但是,建议的答案对我来说效果不好,因为我想要实现的是在iOS和Mac OS上都使用OSBezierPath
。
我的原始代码如下:
#if os(iOS)
typealias OSBezierPath = UIBezierPath
#else
class OSBezierPath: NSBezierPath {
func addLineToPoint(point:CGPoint) {
self.lineToPoint(point)
}
}
#endif
此代码不起作用,但我发现有两种解决方法比我在另一个问题中的建议答案更优雅。
答案 0 :(得分:3)
此解决方案使用扩展程序向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)
所以编译器很高兴:)
第二个解决方案使用UIBezierPath
的类函数在Xcode 7中转换为适当的初始化器的事实。因此,下面的代码将起作用:
#if os(iOS)
class OSBezierPath: UIBezierPath {
func lineToPoint(point:CGPoint) {
self.addLineToPoint(point)
}
}
#else
typealias OSBezierPath = NSBezierPath
#endif
这允许我们通过在iOS和Mac OS上调用OSBezierPath
来使用lineToPoint
。