【问题标题】:Swift protocol extension with property conforming to protocol具有符合协议的属性的 Swift 协议扩展
【发布时间】:2016-02-14 09:56:12
【问题描述】:

我这样声明了一个协议

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?'

我错过了什么? 谢谢

【问题讨论】:

  • 您更改了jsonRootObject 的类型。现在它不再符合。

标签: swift protocols swift-protocols


【解决方案1】:

在您的示例中,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的实现是协议JSONConnection中蓝图var jsonRootObject: T? { get set }的有效一致性。

【讨论】:

  • 太好了,成功了!感谢您非常清楚的解释!
  • @FredA。乐于助人。
  • 今天这样做会引发一个错误,指出类型别名需要关联类型,这会导致一大堆其他错误。
  • @Bot 我已经有几年没有接触过 Swift 了,但是如果你认为合适的话,可以随时更新这个答案,以防你解决其他所有错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2016-04-30
  • 2013-05-19
相关资源
最近更新 更多