Sto lavorando allo sviluppo di un'applicazione in Swift. Volevo progettare un sistema per l'applicazione che consentisse un accoppiamento lento tra gli oggetti, e una strategia (che ho usato con successo in altri linguaggi) era creare qualcosa che io chiamo una fabbrica di istanze. E 'abbastanza semplice e qui è l'implementazione di base mi è venuta a Swift:Alternativa al metodo di caricamento in Swift
import Foundation
private var typeGenerators = Dictionary<String, InstanceFactory.GeneratorCallback>()
public class InstanceFactory: NSObject {
public typealias GeneratorCallback =() -> AnyObject!
public class func registerGeneratorFor(typeName: String, callback: GeneratorCallback) {
typeGenerators[typeName] = callback
}
public class func instanceOf(typeName: String) -> AnyObject! {
return typeGenerators[typeName]?()
}
}
L'idea è che quando un'istanza oggetto ha bisogno di accedere a un'altra istanza oggetto, piuttosto che la creazione di tale istanza a titolo definitivo che sarebbe più strettamente paio i due oggetti, il primo oggetto si rimanda alla fabbrica per fornire l'istanza necessaria chiamando il metodo instanceOf. La fabbrica saprebbe come fornire vari tipi di istanze perché quei tipi sarebbero registrati con la fabbrica e fornirebbero una chiusura che potrebbe generare l'istanza.
Il trucco è come ottenere le classi per registrarsi in fabbrica. In precedenza avevo creato uno stabilimento simile in Objective-C e il modo in cui ho ottenuto la registrazione al lavoro era di sovrascrivere il metodo di caricamento + per ogni classe che aveva bisogno di registrarsi con la fabbrica. Questo ha funzionato alla perfezione con Objective-C, e ho pensato che potesse funzionare anche per Swift dato che limitavo la factory a fornire solo oggetti derivati da NSObject. Mi è sembrato che riuscissi a far funzionare tutto questo e ho dedicato uno sforzo significativo alla progettazione di corsi per far uso della fabbrica.
Tuttavia, dopo l'aggiornamento a Xcode 6.3, ho scoperto che Apple non ha consentito l'utilizzo del metodo della classe di carico in Swift. Senza questo, non sono a conoscenza di un meccanismo che consenta alle classi di registrarsi automaticamente con la fabbrica.
Mi chiedo se ci sia un altro modo per far funzionare la registrazione.
Quali alternative sono disponibili per consentire alle classi di registrarsi in fabbrica o quali altre tecniche potrebbero essere utilizzate per realizzare lo stesso tipo di accoppiamento libero fornito dalla fabbrica?
Si può continuare ad usare Objective-C per quella parte ...? – matt
Sì, potrei usare Objective-C per questo. Da quello che posso vedere, lo svantaggio di questo sarebbe l'introduzione di moduli aggiuntivi per ogni classe che ha bisogno di registrarsi con la fabbrica, il che potrebbe non essere un grosso problema. Ovviamente potrei semplicemente mettere tutte le registrazioni in un unico metodo di caricamento + per una singola classe. Tuttavia, se l'avessi fatto, avrei potuto facilmente fare anche la registrazione in un modulo Swift, come il delegato dell'applicazione. –
Se dovessi usare moduli multipli, potrei forse anche fare la registrazione in Objective-C++.Sospetto che tutti i moduli di registrazione farebbero praticamente la stessa cosa, quindi sarebbe bello consolidare quella funzionalità. Non ci ho pensato fino in fondo, ma sembra che qualcuno potrebbe forse creare un modello C++ in Objective-C++ che potrebbe contenere la piastra della caldaia per la registrazione. Quindi, di nuovo, è probabile che non sia coinvolto troppo codice, quindi forse non ne vale la pena. –