2016-06-09 12 views
0

Ich versuche, eine Instanz einer Singleton-Klasse in Objective-C geschrieben zu erstellen. Ich muss mich an das Delegiertenprotokoll halten. Die Swift Implementierung sieht ungefähr so ​​aus:Ambiguous Verweis auf Mitglied "Delegat"

class SomeClass: ManagerDelegate { 
    let manager = Manager.sharedInstance() 

    func someFunction(){ 
    manager.delegate = self 
    } 
} 

Die Objective-C Singletonklasse etwa wie folgt aussieht:

// header 
@protocol ManagerDelegate <NSObject> 
@required 
-(void)delegateMethod; 
@end 

@interface Manager : NSObject { 

} 
+ (id)sharedInstance; 
@property (nonatomic, assign) id delegate; 
@end 


// class file 
+ (id) sharedManager{ 
    static Manager *theSharedManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    theSharedManager = [[self alloc] init]; 
    }); 

    return theSharedManager; 
} 

- (void) someInternalMethod{ 
    [delegate delegateMethod]; 
} 

Nach den Delegaten Angabe (manager.delegate = self), erhalte ich die Fehler

Unklarer Verweis auf Mitglied 'Delegierter'

Ist die Objective-C-Klasse nicht ordnungsgemäß erstellt oder wird sie falsch implementiert? Vermisse ich etwas anderes? so

let manager = Manager.sharedInstance() //manager is AnyObject due to bridging between objc and swift 

gibt Ihnen ANYOBJECT für Manager Eigenschaft

+0

Sie sagen "Die Objective-C-Singleton-Klasse sieht ungefähr so ​​aus"; Erbt der Singleton nur von 'NSObject' oder erbt er auch von einem anderen Objekt? – Paulw11

+0

Ich habe einen Test eingerichtet, der nur von NSObject erbt und immer noch den mehrdeutigen Referenzfehler empfängt. –

+1

Ich weiß nicht, ob dies dem Problem mit dem Swift-Code helfen wird, aber die 'delegate'-Eigenschaft in der Objective-C-Klasse sollte als '@property (nonatomic, schwach) id delegate;'. – rmaddy

Antwort

2

Ihr Problem durch die Definition Ihrer sharedInstance Methode in Objective-C verursacht wird. Durch Deklarieren als

+ (id)sharedInstance; 

wird es in sharedInstance() konvertiert -> AnyObject! in Swift. Swift weiß dann nicht, welche der vielen möglichen delegate Eigenschaften, die Sie finden können, meinen. Wenn Sie Ihre Ziel-C-Deklaration und Implementierung ändern:

+ (instancetype)sharedInstance; 

Ihr Problem wird verschwinden.

Und wie @rmaddy darauf hinweist, sollte Ihr Delegat weak nicht assign sein. Wenn Sie assign verwenden, wird delegate als ein ungültiger Zeiger in dem Fall belassen, in dem der Delegat freigegeben wird.

Auch die Verwendung eines Delegaten mit einem Singleton ist ein bisschen widersprüchlich. Vorausgesetzt, dass Sie immer nur eine Instanz der Manager haben, die von einer Reihe anderer Objekte verwendet werden kann und Sie nur jeweils einen aktiven Delegaten haben können, besteht das Potenzial für Konflikte.

Ich würde vorschlagen, dass entweder Blöcke/Schließungen oder NSNotification ist eine bessere Möglichkeit, Rückrufe von einem Singleton zurückzurufen.

1

Sein, weil, wenn Sie zB von Objective-C-Code zu raschen bringen es als ANYOBJECT gibt. Sie müssen dieses AnyObject zwangsweise in Manager umwandeln, um es als Manager-Instanz wie unten zu verwenden.

class SomeClass: NSObject, ManagerDelegate { 
    let manager = Manager.sharedInstance() as! Manager //here was your error 

    func someFunction(){ 
     manager.delegate = self 
    } 
    func delegateMethod() { 
     print("Hello") 
    } 
} 

Hope this löst Ihr Problem :)

+0

Wäre das nicht behoben, wenn der Objective-C-Code ordnungsgemäß 'sharedInstance' deklariert, um' instancetype' anstelle von 'id' zurückzugeben? – rmaddy

+0

ja, großartig.es wird es auch lösen. Ich kenne Objectiv-c nicht, also gab ich die Lösung, was ich von swift verstehen konnte. – Dari

Verwandte Themen