2016-03-22 8 views
3

Ich bin eine „mehrdeutige Verwendung von init“ Fehlern bekommen, wenn Objective-C-Klassen auf zwei mit Xcode 7.3 und Swift 2.2mehrdeutige Verwendung von init in Swift 2.2

Das Problem im Zusammenhang Aufbau ist und wie Swift sieht ihren initializers .

ObjC sieht:

Superklasse

@interface Foo: NSManagedObject 
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context; 

Subclass

@interface Bar: Foo 
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context; 

während Swift sieht nur:

init(owner: Owner!, insertIntoManagedObjectContext context: NSManagedObjectContext!) 

was dazu führt, dass der Compiler unsicher ist, welcher Init für die Unterklasse "Bar" aufgerufen wird. Gibt es eine Möglichkeit anzugeben, welcher Initialisierer beim Initialisieren der Unterklasse verwendet werden soll? Ich möchte vermeiden, die Init-Methode wenn möglich zu refaktorieren.

+0

Sie benennen können 'makeFooWithOwner ...' und '' makeBarWithOwner ... oder etwas ähnliches und es wird sie nicht konvertieren zu Initialisierer – dan

+1

Können Sie den Swift-Code posten, mit dem Sie das Problem haben? Ich kopiere/klebte in ein neues Projekt und hatte keine Probleme beim Kompilieren. – Kevin

+0

Es gibt keinen Grund, warum die ursprünglichen Obj-C-Methoden in erster Linie andere Namen haben sollten. – Sulthan

Antwort

4

Es ist aufgrund ObjC->Swift API translation rules.

Sie können das Attribut swift_name verwenden, um diese Regeln zu überschreiben.

@interface Foo: NSManagedObject 
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context NS_SWIFT_NAME(foo(owner:moc:)); 

@interface Bar: Foo 
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context NS_SWIFT_NAME(bar(owner:moc:)); 

Dann können Sie diese separat in Swift Code aufrufen:

let foo = Bar.foo(owner: owner, moc: context) 
let bar = Bar.bar(owner: owner, moc: context) 
0

Ich bin mir nicht sicher, was los ist, btw ich habe das versucht. Im ObjC Header hinzugefügt ich diese zwei Klassenmethoden:

+ (id)barWithInitializer:(NSString *)className 
initializer:(SEL)initializer 
    argument:(id)argument; 

+ (id)fooWithInitializer:(NSString *)className 
       initializer:(SEL)initializer 
        argument:(id)argument; 

Dann in der Swift-Funktion

Ich habe versucht, beide ohne Ausgabe/Schnittstelle Mismatch

return OBJCObjectFactory.barWithInitializer(className, initializer: initializer, argument: argument) as! TBase? 

return OBJCObjectFactory.fooWithInitializer(className, initializer: initializer, argument: argument) as! TBase? 
Verwandte Themen