![](/img/trans.png)
[英]In Swift 3, is it possible for a subclass to inherit defaults from its superclass?
[英]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)
所以編譯器很高興:)
第二個解決方案使用了這樣的事實,即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.