2014-12-29 11 views
6

La documentazione Apple suggerisce di sovrascrivere un init di comodità NSDocument (initWithType: error :) come descritto here.Come inizializzare una nuova istanza NSDocument in Swift?

Tuttavia, poiché questo è un init di comodità, non è possibile sovrascriverlo. Ma ho ancora bisogno di eseguire del codice quando viene creato un nuovo documento. Non voglio eseguire quel codice quando carico un documento.

Nel mio caso particolare cerco di inizializzare un NSPersistentDocument, ma dubito che sia rilevante.

Cosa devo fare?

+0

si crea una sottoclasse di NSPersistentDocument ... quindi lo si imposta nel proprio info.plist o ovunque vada ... in modo che l'applicazione associ quella classe al tipo –

+0

ok, la domanda consente diverse interpretazioni. Scusate. Ho bisogno di eseguire codice dopo la creazione. Questo è ciò che consente la comodità init. Ma non sono sicuro di dove farlo ora, quando non posso più ignorare questo particolare init. –

+0

Cosa vuoi dire che non puoi sovrascrivere l'init? –

risposta

8

per eseguire codice di inizializzazione per un nuovo documento:

// 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 
} 

Il problema in Swift è che non si può chiamare un inizializzatore convenienza eccellente. Invece è necessario delegare a un inizializzatore designato in sé. Ciò significa che non è possibile usufruire di alcuno degli inizializzatori di convenienza di supers ed è necessario implementare l'inizializzazione autonomamente --- quindi fileType = typeName sopra. Per quanto mi piaccia Swift, trovo questo stupido: qual è il punto di ri-implementazione del codice che potrebbe essere riutilizzato !?

+1

Temo che questo sia il massimo. Grazie, soprattutto per il suggerimento typeName. –

10

risposta di cui sopra funziona per Swift 1.

Essa deve essere cambiato per rispondere sotto a Swift 2:

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

Questo è stato risposto qui: http://meandmark.com/blog/2015/07/nsdocument-initwithtype-in-swift-2/

Ripubblicato per convenienza dal questo è un problema comune

+0

Grazie per aver condiviso! –