繁体   English   中英

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

class JSONStockDetailRootObject: JSONSerializable

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

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

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

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

我错过了什么? 谢谢

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

你可以通过在协议JSONConnection引入一个typealias来解决这个问题,比方说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 ,因此上面jsonRootObjectStockConnection的实现是蓝图var jsonRootObject: T? { get set }有效一致性var jsonRootObject: T? { get set } 协议JSONConnection var jsonRootObject: T? { get set }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM