gpt4 book ai didi

属性符合协议(protocol)的 Swift 协议(protocol)扩展

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:50 24 4
gpt4 key购买 nike

我这样声明了一个协议(protocol)

protocol JSONConnection {
var request: NSURLRequest { get set }
var session: NSURLSession { get set }
var jsonRootObject: JSONSerializable? { get set }
}

这里的 JSONSerializable 不是实际类型,它是我声明的另一个协议(protocol):

protocol JSONSerializable {
func readFromJSON(json: JSON) throws
}

所以,事实上,这个 JSONConnection 协议(protocol)需要一个名为 jsonRootObject 的变量,它只需要符合 JSONSerializable 协议(protocol)即可。

很好。


现在,实现。

我创建了一个名为 JSONStockDetailRootObject 的类,它符合 JSONSerializable 协议(protocol)。

class JSONStockDetailRootObject: JSONSerializable

我想创建一个符合 JSONConnection 协议(protocol)的 StockConnection 类。

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

我认为,如果我有一个符合 JSONSerializable 协议(protocol)的类型的 jsonRootObject 变量,那么 StockConnection 类将反过来符合 JSONConnection 协议(protocol)……但不是。

编译器声称:“协议(protocol)需要类型为‘JSONSerializable’的属性‘jsonRootObject’?”

我错过了什么?谢谢

最佳答案

在您的示例中,类 StockConnection 不包含蓝图 var jsonRootObject: JSONSerializable? 的任何有效实现? { get set } ,它 promise 通过符合 JSONConnection 来实现。请注意,在 jsonRootObject 的上下文中,JSONSerializable 是一个类型,即使 JSONStockDetailRootObject 符合JSONSerializable,它不能被视为相同类型。

你可以通过在协议(protocol) 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 的实现是蓝图的有效符合 var jsonRootObject:T? { 在协议(protocol) JSONConnection 中设置 }

关于属性符合协议(protocol)的 Swift 协议(protocol)扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com