2014-06-07 12 views
6

Mam podklasę TyphoonAssembly, który zawiera tę metodę fabryczną:Tworzenie Swift instancji z metody fabryki Objective-C

+ (instancetype)assembly; 

staram się go używać w teście następująco:

var assembly : ApplicationAssembly! = ApplicationAssembly.assembly() 

Ale dostać błąd "assembly() jest niedostępny" (patrz zdjęcie).

Jaki jest poprawny sposób utworzenia instancji Swift z metody klasy obiektu C?

enter image description here

+0

Przeszedłem przez ten sam problem. Zamiast używania fikcyjnego parametru możesz zmienić nazwę statycznej metody. Na przykład: + (instancetype) sharedInstance; przechodzi przez most. – kokluch

Odpowiedz

4

Gdy pomostowego kod z celem C Swift kompilator próbuje konwersji metod klasy konstruktory normalnych inicjalizatorów. Spróbuj wywołać tylko ApplicationAssembly() i sprawdź, czy wywołuje twoją metodę klasy. Można również zmienić nazwę metody klasy, aby kompilator nie rozpoznał go jako typowego nazewnictwa konstruktora.

Oto przykład funkcjonującego mostka:

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

To nie działa z pustym metoda klasy konstruktora jak próbujesz uzyskać dostęp.

+0

Wywołanie ApplicationAssembly() przeszło od razu do init, który był w rzeczywistości prywatny, ponieważ metoda klasy wykonała jakąś dalszą konfigurację przed powrotem. . . na szczęście ta dodatkowa konfiguracja może być bezpiecznie przeniesiona do init. . . Nie jestem pewien, co zrobić, jeśli: a) Nie jestem klasą ObjC, którą kontroluję lub b) Nie można jej przenieść. –

+0

@JasperBlues Ya Ja też nie jestem pewien. Zrobiłem kilka eksperymentów i nie mogłem znaleźć inicjalizatora, który nazwałby metodę klasy. – drewag

+0

Nota boczna: 'new' prawdopodobnie najlepiej pozostawić dla' [MyClass new] ', które jest skrótem do' [[MyClass alloc] init] '. –

Powiązane problemy