2014-11-25 39 views
0

是不是功能放在方便初始化 - 在子類中不可用?功能放在一個方便的init - 在子類中不可用?

如果是這樣,爲什麼Cocoa的Swift接口定義瞭如此多的初始化方法是方便的。

例如 - 我有一個NSWindowController的子類,我想創建一個指定的init,它不會得到任何參數,應該直接知道要實例化的NIB文件。

但我沒有任何訪問super.init的方法來獲取已經實現的行爲並在其上構建。這裏是NSWindowController的inits的定義:

class NSWindowController : NSResponder, NSCoding, NSSeguePerforming, NSObjectProtocol { 
    init(window: NSWindow?) 
    init?(coder: NSCoder) 

    convenience init(windowNibName: String) 
    convenience init(windowNibName: String, owner: AnyObject) 
    convenience init(windowNibPath: String, owner: AnyObject) 
    // ... 
} 

相反,我不得不重新實現NIB加載,從而複製和潛在犯錯。

編輯:

這裏是一個blogpost由邁克灰小通道,提NSWindowController子類和後面我在我的情況下做的理由是完全一樣的:

NSWindowController提供initWithWindowNibName:方法。但是,您的子類只能使用一個筆尖工作,因此讓客戶端指定筆尖名稱是沒有意義的。相反,我們會提供一個簡單的初始化方法,在內部做正確的事情。簡單地覆蓋它超打電話,並提供筆尖名稱:

- (id)init 
{ 
    return [super initWithWindowNibName: @"MAImportantThingWindow"]; 
} 

所以它可能在的ObjectiveC,卻怎麼也該在斯威夫特做?

回答

1

便捷初始值設定項在子類中繼承。它們也可以被覆蓋。

爲了調用的init(windowNibName:字符串),你需要聲明一個方便初始化從調用它,你應該把它在自我,而不是

class MAImportantThingWindowController : NSWindowController { 

    override convenience init() { 
     self.init(windowNibName: "MAImportantThingWindow") 
    } 
} 
+1

謝謝!我已經編輯了一些答案。我希望那樣更好。 – 2014-11-25 11:02:08

相關問題