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 的 class,它符合 JSONSerializable 协议。
class JSONStockDetailRootObject: JSONSerializable
我想创建一个符合 JSONConnection 协议的 StockConnection class。
class StockConnection: JSONConnection {
var request: NSURLRequest
var session: NSURLSession
var jsonRootObject: JSONStockDetailRootObject?
}
我认为,如果我有一个符合 JSONSerializable 协议的类型的 jsonRootObject 变量,那么这个 class StockConnection 将反过来符合 JSONConnection 协议......但是没有。
编译器声明:“协议要求 属性 'jsonRootObject' 类型为 'JSONSerializable?'
我错过了什么?
谢谢
在您的示例中,class 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
,上面 StockConnection
中 jsonRootObject
的实现是协议 [=13= 中蓝图 var jsonRootObject: T? { get set }
的有效一致性].
我这样声明了一个协议
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 的 class,它符合 JSONSerializable 协议。
class JSONStockDetailRootObject: JSONSerializable
我想创建一个符合 JSONConnection 协议的 StockConnection class。
class StockConnection: JSONConnection {
var request: NSURLRequest
var session: NSURLSession
var jsonRootObject: JSONStockDetailRootObject?
}
我认为,如果我有一个符合 JSONSerializable 协议的类型的 jsonRootObject 变量,那么这个 class StockConnection 将反过来符合 JSONConnection 协议......但是没有。
编译器声明:“协议要求 属性 'jsonRootObject' 类型为 'JSONSerializable?'
我错过了什么? 谢谢
在您的示例中,class 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
,上面 StockConnection
中 jsonRootObject
的实现是协议 [=13= 中蓝图 var jsonRootObject: T? { get set }
的有效一致性].