簡體   English   中英

Swift中的子類不會繼承其超類的初始化程序

[英]Subclass in Swift does not inherit initialiser of its superclass

當嘗試NSBezierPath時,我偶然發現了一個非常奇怪的問題。

下面是我的子類的定義:

class OSBezierPath: NSBezierPath {

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

除了無法訪問NSBezierPath某些初始化程序外,該子類的工作原理也不同。 例如,下面的行無效:

let path = OSBezierPath(ovalInRect: rect)

編譯器拋出錯誤

調用中的額外參數'ovalInRect'

此錯誤的原因

這個錯誤的原因在另一個問題中得到了很好的解釋。 但是,建議的答案對我來說效果不佳,因為我要實現的目標是在iOS和Mac OS上都使用OSBezierPath

我的原始代碼是這樣的:

#if os(iOS)
    typealias OSBezierPath = UIBezierPath
#else
    class OSBezierPath: NSBezierPath {

        func addLineToPoint(point:CGPoint) {
            self.lineToPoint(point)
        }
    }
#endif

這段代碼不起作用,但是我發現了2個變通辦法,它們比另一個問題中的建議答案更為優雅。

第一種解決方案

此解決方案使用擴展將功能添加到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM