2014-12-29 11 views
6

Apple Dokumentation schlägt vor, eine NSDocument Bequemlichkeit init (initWithType: Fehler :) überschreiben wie beschrieben here.Wie initialisiere ich eine neue NSDocument-Instanz in Swift?

Da dies jedoch ein Komfort-Init ist, kann ich es nicht überschreiben. Aber ich muss noch etwas Code ausführen, wenn ein neues Dokument erstellt wird. Ich möchte diesen Code nicht ausführen, wenn ich ein Dokument einlege.

In meinem speziellen Fall versuche ich ein NSPersistentDocument zu initialisieren, aber ich bezweifle, dass das relevant ist.

Was soll ich tun?

// Create new document (only called for new documents) 
convenience init?(type typeName: String, error outError: NSErrorPointer) { 
    self.init() 
    fileType = typeName 
    // add your own initialisation for new document here 
} 

Das Problem in Swift ist, dass Sie nicht rufen Sie einen Komfort initializer in Super:

+0

Sie machen eine Unterklasse von NSPersistentDocument ... dann stellen Sie das in Ihrer info.plist oder wo auch immer das hin ... so dass Ihre Anwendung diese Klasse mit dem Typ –

+0

verbindet, ok, Frage erlaubt unterschiedliche Interpretationen. Es tut uns leid. Ich muss den Code nach der Erstellung ausführen. Das ermöglicht die Komfort-Init. Aber ich bin mir nicht sicher, wo ich das jetzt tun soll, wenn ich diese bestimmte Init nicht mehr außer Kraft setzen kann. –

+0

Was meinen Sie damit, dass Sie die Init nicht überschreiben können? –

Antwort

8

Um init-Code für ein neues Dokument auszuführen. Stattdessen müssen Sie an einen bestimmten Initialisierer in self delegieren. Dies bedeutet, dass Sie keinen der Super-Convenience-Initialisierer nutzen können und Sie müssen die Initialisierung Ihres Selbst implementieren - daher fileType = typeName oben. So sehr ich Swift mag, finde ich das blöd: Was bringt es, Code wiederzuverwenden, der wiederverwendet werden könnte?

+1

Ich fürchte, das ist so gut wie es geht. Danke, besonders für den typeName Hinweis. –

10

Above Antwort arbeitet für Swift 1.

Es hat geändert werden unter 2 in Swift zu beantworten:

convenience init(type typeName: String) throws { 
    self.init() 
    // Rest of initialization code here 
} 

Dies wurde hier beantwortet: http://meandmark.com/blog/2015/07/nsdocument-initwithtype-in-swift-2/

Reposted für Bequemlichkeit seit Das ist ein häufiges Problem.

+0

Danke für das Teilen! –