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