【问题标题】:Ambiguous reference to member 'delegate'对成员“代表”的含糊提及
【发布时间】:2016-06-09 03:26:28
【问题描述】:

我正在尝试创建一个用 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 类的格式是否不正确,还是我执行不正确?我还缺少其他东西吗?

【问题讨论】:

  • 你说“Objective-C 单例类看起来像这样”;单例是仅继承自 NSObject 还是也继承自其他对象?
  • 我设置了一个仅继承自 NSObject 的测试,但仍然收到不明确的引用错误。
  • 我不知道这是否有助于解决 Swift 代码的问题,但 Objective-C 类中的 delegate 属性应声明为 @property (nonatomic, weak) id&lt;ManagerDelegate&gt; delegate;

标签: objective-c swift delegates


【解决方案1】:

您的问题是由 Objective-C 中 sharedInstance 方法的定义引起的。通过将其声明为

+ (id)sharedInstance;

它被转换为 sharedInstance() -> AnyObject!在斯威夫特。然后,Swift 不知道它可以找到的许多潜在 delegate 属性中的哪一个是您的意思。如果您将 Objective C 声明和实现更改为:

+ (instancetype)sharedInstance;

你的问题会消失的。

正如@rmaddy 指出的那样,您的代表应该是weak 而不是assign。如果你使用assign,那么delegate 将在委托被解除分配时作为无效指针留下。

此外,将委托与单例一起使用有点矛盾。鉴于您将只有一个 Manager 实例,它可能被许多其他对象使用,并且您一次只能有一个活动委托,因此可能会发生冲突。

我建议使用块/闭包或NSNotification 是从单例回调的更好方法。

【讨论】:

    【解决方案2】:

    这是因为每当您将实例从目标 c 代码带到 swift 时,它都会以 AnyObject 的形式提供

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

    为您提供管理器属性的 AnyObject。您需要将该 AnyObject 强制转换为 Manager 以将其用作 manager 的实例,如下所示。

    class SomeClass: NSObject, ManagerDelegate {
        let manager = Manager.sharedInstance() as! Manager //here was your error
    
        func someFunction(){
            manager.delegate = self
        }
        func delegateMethod() {
            print("Hello")
        }
    }
    

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

    【讨论】:

    • 如果 Objective-C 代码正确声明 sharedInstance 以返回 instancetype 而不是 id,这不会得到解决吗?
    • 是的,太好了。它也会解决它。我不知道objective-c,所以我给出了我能从swift中理解的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2019-11-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多