对成员'委托'的模棱两可的提及

时间:2016-06-09 03:26:28

标签: objective-c swift delegates

我试图创建一个用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类是不正确形成的还是我错误地实现了它?我错过了别的什么吗?

2 个答案:

答案 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")
    }
}

希望这能解决您的问题:)