2014-06-07 14 views
6

ho una sottoclasse di TyphoonAssembly, che contiene questo metodo di fabbrica:Creare esempio Swift dal metodo factory Objective-C

+ (instancetype)assembly; 

sto cercando di usarla in un test come segue:

var assembly : ApplicationAssembly! = ApplicationAssembly.assembly() 

Ma ottenere l'errore 'assembly() non è disponibile' (vedere l'immagine).

Qual è il modo corretto di creare un'istanza Swift da un metodo di classe C obiettivo.

enter image description here

+0

Ho affrontato lo stesso problema. Anziché utilizzare un parametro dummy, è possibile modificare il nome del metodo statico. Ad esempio: + (instancetype) sharedInstance; passa attraverso il ponte. – kokluch

risposta

4

Quando colmare codice Objective-C al rapido il compilatore tenta di convertire metodo di classe costruttori per inizializzatori normali. Prova a chiamare solo ApplicationAssembly() e vedi se chiama il tuo metodo di classe. Puoi anche cambiare il nome del tuo metodo di classe in modo che il compilatore non lo riconosca come una denominazione comune del costruttore.

Ecco un esempio di un ponte funzionante:

// Objective-C 
@implementation ApplicationAssembly 

+ (instancetype)assemblyWithValue:(NSString *)value 
{ 
    ApplicationAssembly *new = [[self alloc] init]; 
    new.value = @"Some_Value_To_Make_Sure_That_This_Code_Is_Running"; 
    return new; 
} 

@end 

// Swift 
var assembly = ApplicationAssembly(value: "") 
println(assembly.value) // outputs "Some_Value_To_Make_Sure_That_This_Code_Is_Running" 

Non funziona con un metodo di classe costruttore vuoto come si sta tentando di accedere.

+0

La chiamata ApplicationAssembly() è passata direttamente a init, che in realtà era privata, perché il metodo di classe ha fatto qualche ulteriore configurazione prima di tornare. . . fortunatamente quella configurazione aggiuntiva potrebbe essere spostata in modo sicuro su init. . . Non so cosa fare se a) Non è una classe ObjC che controllo o b) Non è stato possibile spostarlo. –

+0

@ JasperBlues Ya non ne sono sicuro neanche io. Ho fatto qualche sperimentazione e non sono riuscito a trovare un inizializzatore che chiamasse il metodo di classe – drewag

+0

Nota a margine: 'new' è probabilmente la migliore per' [MyClass new] 'che è una scorciatoia per' [[MyClass alloc] init] '. –

Problemi correlati