[英]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.