我试图创建一个用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
)后,收到错误
对成员&#39;委托&#39;
的模棱两可的提及
Objective-C类是不正确形成的还是我错误地实现了它?我错过了别的什么吗?
答案 0 :(得分:2)
您的问题是由Objective-C中sharedInstance
方法的定义引起的。通过声明为
+ (id)sharedInstance;
它被转换为sharedInstance() - &gt; AnyObject!在斯威夫特。 Swift然后不知道它可以找到你意味着的许多潜在delegate
属性中的哪一个。如果您将Objective C声明和实现更改为:
+ (instancetype)sharedInstance;
你的问题会消失。
正如@rmaddy指出的那样,您的代表应该是weak
而不是assign
。如果您使用assign
,则在委托被取消分配的情况下,delegate
将被保留为无效指针。
此外,使用带有单例的委托也有点矛盾。鉴于您将只有一个Manager
实例可能被许多其他对象使用,并且您一次只能有一个活动委托可能存在冲突。
我建议阻止/关闭或NSNotification
是一种更好的方法来回答单身人士。
答案 1 :(得分:1)
因为每当你将客观c代码中的实例带到swift时它就像AnyObject那样提供
let manager = Manager.sharedInstance() //manager is AnyObject due to bridging between objc and swift
为manager属性提供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")
}
}
希望这能解决您的问题:)