Swift中的子类不继承其超类的初始化

时间:2015-08-05 03:16:28

标签: ios macos swift inheritance swift2

在尝试子类化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

此代码不起作用,但我发现有两种解决方法比我在另一个问题中的建议答案更优雅。

1 个答案:

答案 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)

所以编译器很高兴:)

第二解决方案(Xcode 7)

第二个解决方案使用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