[英]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
,因此上面jsonRootObject
中StockConnection
的实现是蓝图var jsonRootObject: T? { get set }
有效一致性var jsonRootObject: T? { get set }
协议JSONConnection
var jsonRootObject: T? { get set }
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.