簡體   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