【问题标题】:Subclass in Swift does not inherit initialiser of its superclassSwift 中的子类不继承其超类的初始化器
【发布时间】:2015-08-05 03:16:28
【问题描述】:

我在尝试继承 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

此代码不起作用,但我发现了 2 个解决方法,它们比另一个问题中建议的答案更适合我的目的。

【问题讨论】:

  • stackoverflow.com/questions/29867782/… 相同的问题,尽管 UI 和 NS 之间存在差异。真正的解决方案是一样的:更新到 Xcode 7 测试版,其中 API 被修复。
  • 首先,非常感谢您提出这个问题!其次,我正在使用 Xcode 7 beta - 仍然没有运气。
  • 我实际上并没有检查 NSBezierPath 的情况,所以我可能是错的。但在 Xcode 7 中,UIBezierPath 是可子类化的 - 类函数已转换为适当的初始化程序并被继承。
  • 是的,它们用于 UIBezierPath。但不适用于 NSBezierPath。但是,正如我现在知道的那样,我所经历的并不是真正的错误,我有两种方法可以实现我想要的。您建议的方法肯定会起作用,但如果您检查“P.S.”部分你会看到它们对我的情况来说不是很优雅。我现在将使用其他两种可行的方法发布答案
  • @matt 请重新打开问题,以便我可以添加 2 个更适合 iOS/Mac 便携性的解决方法:)

标签: ios macos swift inheritance swift2


【解决方案1】:

第一种解决方案

此解决方案使用扩展向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 上通过调用lineToPoint 来使用OSBezierPath

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多