为什么在Swift中我们不能采用协议而不继承NSObject类?

24

如果我使用以下代码,它会显示错误:“Type 'HttpConnection' does not conform to protocol 'NSObjectProtocol'”

class HttpConnection : NSURLConnectionDataDelegate {
        var urlConnection       : NSURLConnection?
        weak var delegate       : HttpConnecting?

        init(delegate:HttpConnecting){
            self.delegate = delegate;
        }

        func startAsynRequestWithUrlString(url:NSString, withMethod:NSString){
        }
    }
如果我将HttpConnection的子类化为NSObject,那么它就可以正常工作。所以我的问题是,当我需要在Swift中采用NSURLConnectionDataDelegate协议时,为什么需要从NSObject继承类?

相关链接:https://dev59.com/OF8f5IYBdhLWcg3wJPxl - ma11hew28
2个回答

47

NSURLConnectionDataDelegate本身继承自NSURLConnectionDelegate,后者又继承自NSObjectProtocol

这意味着除了实现所有来自NSURLConnectionDataDelegateNSURLConnectionDelegate的方法外,您还必须实现来自NSObjectProtocol的所有方法(例如,相等性、哈希等)。

如果您从NSObject继承,那么所有NSObjectProtocol方法已经为您实现,因此如果没有实现这些方法,那就是您的错误。


谢谢,是的,我看到了NSObjectProtocol中的所有方法都是必需的方法 :) - Saurav Nagpal

4
由于在文档中写道:

NSURLConnectionDataDelegate协议描述了应该由NSURLConnection类的实例的委托实现的方法。在OS X和iOS的之前版本中,该协议的许多方法作为非正式协议的一部分存在。

除了此协议中描述的方法之外,NSURLConnection委托还应实现NSURLConnectionDelegate协议中描述的方法。

而NSURLConnectionDelegate符合NSObject。只需使您的类继承自NSObject即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接