【问题标题】: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 继承类?

【问题讨论】:

标签: swift


【解决方案1】:

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

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

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

【讨论】:

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

因为在documentation 中它说:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多