属性符合协议的Swift协议扩展

属性符合协议的Swift协议扩展,swift,protocols,swift-protocols,Swift,Protocols,Swift Protocols,我宣布了这样的协议 protocol JSONConnection { var request: NSURLRequest { get set } var session: NSURLSession { get set } var jsonRootObject: JSONSerializable? { get set } } 这里,JSONSerializable不是一个实际的类型,它是我声明的另一个协议: protocol JSONSerializable { func re

我宣布了这样的协议

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协议

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


现在,对于实现

我创建了一个名为JSONStockDetailRootObject的类,该类符合JSONSerializable协议

class JSONStockDetailRootObject: JSONSerializable
class StockConnection: JSONConnection {
  var request: NSURLRequest
  var session: NSURLSession
  var jsonRootObject: JSONStockDetailRootObject?
}
我想创建一个符合JSONConnection协议的StockConnection类

class JSONStockDetailRootObject: JSONSerializable
class StockConnection: JSONConnection {
  var request: NSURLRequest
  var session: NSURLSession
  var jsonRootObject: JSONStockDetailRootObject?
}
我认为,如果我有一个类型符合JSONSerializable协议的jsonRootObject变量,那么这个类StockConnection将反过来符合JSONConnection协议。。。但是没有

编译器声明:“协议需要类型为'JSONSerializable'的属性'jsonRootObject'”

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

您可以通过在协议
JSONConnection
中引入类型别名来解决这个问题,比如
T
(用作
jsonRootObject
type);其中
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
,因此上述
StockConnection
中的
jsonRootObject
的实现有效地符合蓝图
var jsonRootObject:T?{get set}
在protocol
JSONConnection

中,您更改了
jsonRootObject
的类型。现在它不再符合了。太好了,成功了!感谢您的清晰解释!@FredA。很乐意帮忙。今天这样做会引发一个错误,即类型别名需要关联的类型,这会导致一大堆其他错误。@Bot我没有在几年内触动了斯威夫特,但如果您认为合适,请随时更新此答案,以防您解决所有其他错误。