Swift 协议扩展 属性 符合协议

Swift protocol extension with property conforming to protocol

我这样声明了一个协议

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 的 class,它符合 JSONSerializable 协议。

class JSONStockDetailRootObject: JSONSerializable

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

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

我认为,如果我有一个符合 JSONSerializable 协议的类型的 jsonRootObject 变量,那么这个 class StockConnection 将反过来符合 JSONConnection 协议......但是没有。

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

我错过了什么? 谢谢

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

你可以通过在协议 JSONConnection 中引入类型别名来解决这个问题,比如 T(用作 jsonRootObject 类型);其中 T 被限制为符合 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,上面 StockConnectionjsonRootObject 的实现是协议 [=13= 中蓝图 var jsonRootObject: T? { get set } 的有效一致性].