【问题标题】:Set a generic class as a delegate in swift在 swift 中将泛型类设置为委托
【发布时间】:2015-11-07 02:19:05
【问题描述】:

我有一个类XMLUtil,它包含一些xml 解析功能。该类有一个通用参数T。该类还充当NSXMLParserDelegate 到NSXMLParser 的委托人。

class XMLUtil<T>: NSObject, NSXMLParserDelegate{
    ...
    ...

    init(){
        parser = NSXMLParser(data: NSData)
        parser.delegate = self
        parser.parse()
    }

    ...
    ...
    //delegate method implementations

}

问题:

当我的 XMLUtil 类是泛型类时,委托方法永远不会被调用。但是,当我在没有泛型参数的情况下实现 XMLUtil 类时,它们会这样做

这两个问题似乎性质相似

Swift Generic class as delegate

NSURLConnection Delegate Methods Not Called In Generic Class

文档中有什么可以解释这种行为的吗?这是故意的还是一个错误?

【问题讨论】:

  • 是的,您引用的链接可以告诉您答案。泛型类不能是 Cocoa 类的委托。这不是一个错误......这是一个尚未实现的功能。我不知道它是否会被实施。这可能是不可能的。但这是当前的限制。

标签: swift generics delegates


【解决方案1】:

当我的 XMLUtil 类是泛型类时

但是 Objective-C 对泛型类一无所知。所以没有办法将您的 XMLUtil 类显示给 Objective-C。因此,它不能作为 NSXMLParser 的委托; NSXMLParser 是一个 Objective-C 类,如果它是泛型的,则无法看到您的 XMLUtil 类。

查看这一点的一个简单方法是尝试将您的 XMLUtil 类标记为@objc。你会失败;编译器会阻止你。无法将此类显示给 Objective-C。

【讨论】:

  • 有趣。那么编译器是否只是表现得好像我的行 parser.delegate = self 不存在?另外,为什么不阻止我将泛型类作为委托分配给 Objective-C 类?
  • “另外,为什么不阻止我将泛型类作为委托分配给 Objective-C 类” 这是一个非常的好问题。你会认为编译器会更早地阻止你,不知何故。就个人而言,我认为这是一个错误;编译器应该更有帮助。让你做一些实际上行不通的事情并不是很好。
  • 我认为声明单个委托方法 @objc 没有帮助?你不能说例如@objc func parserDidStartDocument 等等,他们被叫到了吗?我不希望它起作用,但值得一试。
  • 嗨,马特,快速提问,如果我无法实例化一个对象,我该如何设置委托 = self,因为它是一个我无法在其他类中访问的泛型类,但我想要泛型类调用另一个类中的函数,因此需要委托?
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多