为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?

Posted

技术标签:

【中文标题】为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?【英文标题】:Why in swift we cannot adopt a protocol without inheritance a class from NSObject?为什么我们不能在不从 NSObject 继承类的情况下迅速采用协议? 【发布时间】:2014-07-09 09:44:34 【问题描述】:

如果我使用以下代码,它会显示错误 “类型‘HttpConnection’不符合协议‘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,那么它可以正常工作。所以我的问题是,当我需要快速采用 NSURLConnectionDataDelegate 协议时,为什么我需要从 NSObject 继承类?

【问题讨论】:

相关:***.com/q/24991018/242933 【参考方案1】:

NSURLConnectionDataDelegate 本身继承自 NSURLConnectionDelegate,而 NSURLConnectionDelegate 继承自 NSObjectProtocol

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

你没有实现它们,那是你的错误。如果你继承自NSObject,那么所有NSObjectProtocol 方法都已经为你实现了。

【讨论】:

谢谢,是的,我看到 NSObjectProtocol 中的所有方法都是必需的方法:)【参考方案2】:

因为在documentation 中它说:

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

除了本协议中描述的方法,一个 NSURLConnection 委托也应该实现所描述的方法 在 NSURLConnectionDelegate 协议中。

并且 NSURLConnectionDelegate 符合 NSObject。只要让你的类继承自 NSObject 就可以了。

【讨论】:

以上是关于为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不从 std::allocator 继承

为啥我们不能在不添加偏差或将其转换为 2 或 1 补码的情况下存储 IEEE 浮点数的指数? [复制]

是否可以在不从 DOM 读取的情况下在 Angular 中读取元素的文本内容?

为啥java类不从实现的接口继承注解?

是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?

如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?