通过注入仅符合 Encodable 协议的 class 创建 Encodable class
Creating Encodable class by injecting class conforming only to Encodable protocol
我正在构建使用 Body
class 的网络模块,它将被编码为 url 请求的主体。我想用任何符合 Encodable 协议的 class 初始化 Body
,在我的例子中它是 MyDevice
class 符合 DeviceEncodable
,这是协议定义我的 url 请求所需的一切。 MyDevice
class 已经继承自另一个名为 SpecialClass
的 class,因此我只能使其符合协议,因为 swift 不允许继承多个class。问题是,当我用 DeviceEncodable
初始化 Body
时,我得到错误“类型 'Body' 不符合协议 'Encodable'” 我明白这是因为 DeviceEncodable
可以是 class 但也可以是其他符合它的协议。在 Body
函数中将 DeviceEncodable
用作 属性 的正确解决方案是什么,这样它就可以正确编码并且不需要继承?这是 Samble 代码:
class Body: Encodable {
let device: DeviceEncodable
init(_ deviceInfo: DeviceEncodable) {
self.device = deviceInfo
}
}
protocol DeviceEncodable: AnyObject, Encodable {
var someSpecialProperty: String {get}
}
class MyDevice: SpecialClass, DeviceEncodable {
var someSpecialProperty: String = "special"
}
class SpecialClass {
var someOtherProperty: String = "other"
}
您不能对 device
进行编码,因为 device
必须是符合 Encodable
的具体类型。可能的解决方案是约束为 Encodable
或通用协议的关联类型,例如
class Body<T : Encodable> : Encodable {
let device: T
init(_ deviceInfo: T) {
self.device = deviceInfo
}
}
我正在构建使用 Body
class 的网络模块,它将被编码为 url 请求的主体。我想用任何符合 Encodable 协议的 class 初始化 Body
,在我的例子中它是 MyDevice
class 符合 DeviceEncodable
,这是协议定义我的 url 请求所需的一切。 MyDevice
class 已经继承自另一个名为 SpecialClass
的 class,因此我只能使其符合协议,因为 swift 不允许继承多个class。问题是,当我用 DeviceEncodable
初始化 Body
时,我得到错误“类型 'Body' 不符合协议 'Encodable'” 我明白这是因为 DeviceEncodable
可以是 class 但也可以是其他符合它的协议。在 Body
函数中将 DeviceEncodable
用作 属性 的正确解决方案是什么,这样它就可以正确编码并且不需要继承?这是 Samble 代码:
class Body: Encodable {
let device: DeviceEncodable
init(_ deviceInfo: DeviceEncodable) {
self.device = deviceInfo
}
}
protocol DeviceEncodable: AnyObject, Encodable {
var someSpecialProperty: String {get}
}
class MyDevice: SpecialClass, DeviceEncodable {
var someSpecialProperty: String = "special"
}
class SpecialClass {
var someOtherProperty: String = "other"
}
您不能对 device
进行编码,因为 device
必须是符合 Encodable
的具体类型。可能的解决方案是约束为 Encodable
或通用协议的关联类型,例如
class Body<T : Encodable> : Encodable {
let device: T
init(_ deviceInfo: T) {
self.device = deviceInfo
}
}