2016-06-09 3 views
0

Я пытаюсь создать экземпляр одноэлементного класса, написанного в Objective-C. Я должен соответствовать протоколу делегата. Swift реализация выглядит следующим образом:Неоднозначная ссылка на делегата участника '

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

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

Objective-C класс синглтон выглядит примерно так:

// 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]; 
} 

При задании делегата (manager.delegate = self), я получаю ошибку

Неоднозначная ссылка на делегата участника '

Является ли класс Objective-C некорректно сформированным или я его неправильно реализую? Я что-то пропустил?

+0

Вы говорите: «Один-единственный класс Objective-C выглядит примерно так»; Является ли синглтон только наследованием от 'NSObject' или он наследуется от какого-то другого объекта? – Paulw11

+0

Я устанавливаю тест, который наследует только от NSObject и все еще получает неоднозначную ошибку ссылки. –

+1

Я не знаю, поможет ли это с кодом Swift, но свойство 'delegate' в классе Objective-C должно быть объявлено как' @property (неатомный, слабый) id delegate; '. – rmaddy

ответ

2

Вашей проблема вызвана определением вашего sharedInstance метода в Objective-C. Объявив его как

+ (id)sharedInstance; 

он преобразуется в sharedInstance() -> AnyObject! в Свифт. Swift тогда не знает, какой из многих потенциальных объектов delegate это может означать. Если вы измените декларацию и реализацию Objective C:

+ (instancetype)sharedInstance; 

ваша проблема исчезнет.

И как указывает @rmaddy, ваш делегат должен быть weak не assign. Если вы используете assign, тогда delegate будет оставлен как недопустимый указатель в том случае, если делегат будет освобожден.

Кроме того, использование делегата с одноточечным устройством несколько противоречиво. Учитывая, что у вас будет только один экземпляр Manager, который может использоваться рядом других объектов, и вы можете иметь только один активный делегат за раз, когда есть вероятность конфликтов.

Я бы предположил, что либо блоки/блокировки, либо NSNotification - лучший подход к обратным вызовам из однотонального.

1

Его, потому что всякий раз, когда вы приносите экземпляр из Objective C кода быстрого он дает, как AnyObject так

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

дает AnyObject для менеджера недвижимости. Вам необходимо принудительно применить этот AnyObject к Manager для использования в качестве экземпляра менеджера, как показано ниже.

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

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

Надеется, что это решит вашу проблему :)

+0

Не будет ли это исправлено, если код Objective-C должным образом объявлен 'sharedInstance' для возврата' instancetype' вместо 'id'? – rmaddy

+0

да, отлично.он тоже ее разрешит. Я не знаю цель-c, поэтому я дал решение, что мог понять из-за быстрого. – Dari

Смежные вопросы