5

我像这样声明了一个协议

protocol JSONConnection {
  var request: NSURLRequest { get set }
  var session: NSURLSession { get set }
  var jsonRootObject: JSONSerializable? { get set }
}

在这里, JSONSerializable 不是一个实际的类型,它是我这样声明的另一个协议:

protocol JSONSerializable {
  func readFromJSON(json: JSON) throws
}

所以,事实上,这个 JSONConnection 协议需要一个名为 jsonRootObject 的变量,它只需要符合 JSONSerializable 协议即可。

美好的。


现在,对于实现。

我创建了一个名为 JSONStockDetailRootObject 的类,它符合 JSONSerializable 协议。

class JSONStockDetailRootObject: JSONSerializable

我想创建一个符合 JSONConnection 协议的 StockConnection 类。

class StockConnection: JSONConnection {
  var request: NSURLRequest
  var session: NSURLSession
  var jsonRootObject: JSONStockDetailRootObject?
}

我认为,如果我有一个符合 JSONSerializable 协议的类型的 jsonRootObject 变量,那么 StockConnection 类又将符合 JSONConnection 协议……但不是。

编译器声称:“协议需要属性 'jsonRootObject' 类型为 'JSONSerializable?'

我错过了什么?谢谢

4

1 回答 1

5

在您的示例中,该类StockConnection不包含 blueprint 的任何有效实现var jsonRootObject: JSONSerializable? { get set },它承诺通过符合来实现JSONConnection。请注意,在 的上下文中jsonRootObjectJSONSerializable是一个类型,即使JSONStockDetailRootObject 符合JSONSerializable也不能被视为同一类型。

您可以通过在协议中引入类型别名(例如T,用作jsonRootObject类型)来解决此问题JSONConnection;whereT被限制为符合 的类型JSONSerializable

protocol JSONSerializable {
    func readFromJSON(json: JSON) throws
}

protocol JSONConnection {
    typealias T: JSONSerializable
    var request: NSURLRequest { get set }
    var session: NSURLSession { get set }
    var jsonRootObject: T? { get set }
}

class JSONStockDetailRootObject: JSONSerializable {
    func readFromJSON(json: JSON) throws ...
}

class StockConnection: JSONConnection {
    var request: NSURLRequest = NSURLRequest()
    var session: NSURLSession = NSURLSession()
    var jsonRootObject: JSONStockDetailRootObject?
}

由于JSONStockDetailRootObject符合JSONSerializable,上面的实现是协议中蓝图的jsonRootObject有效StockConnection一致性。var jsonRootObject: T? { get set }JSONConnection

于 2016-02-14T10:01:30.687 回答