Swift中能否通过协议继承实现带wrappedValue的属性包装器?
核心问题
当@propertyWrapper遵循已定义wrappedValue属性的协议时,能否通过协议扩展获得该wrappedValue属性?
若不显式指定wrappedValue属性,会触发如下错误:
Property wrapper type does not contain a non-static property named 'wrappedValue'
示例
假设我们有如下模型:
struct User: Decodable { @DefaultFalse var isVerified: Bool ... }
其中@DefaultFalse是一个@propertyWrapper,当属性被解码为null时,会将其默认值设为false。
为实现这一功能,我们可以设计一个通用协议:
protocol Default: Decodable { associatedtype Value: Decodable static var defaultValue: Value { get } var value: Value? { get set } } extension Default { var wrappedValue: Value { get { value ?? Self.defaultValue } set { value = newValue } } init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if container.decodeNil() { value = nil } else { value = try container.decode(Value.self) } } }
该Default协议可为任意Decodable类型设置默认值(不仅限于Bool)。我们的@DefaultFalse实现如下:
@propertyWrapper struct DefaultFalse: Default { static let defaultValue = false var value: Bool? }
但此时会触发上述错误。
我知道在这个示例中,直接使用Bool?并通过isVerified ?? false处理更简单,但此处是对实际场景的简化。
其他信息
我在Swift论坛上发现了一个类似问题,目前尚无答案。
内容的提问来源于stack exchange,提问作者Bechsh
相关产品推荐
相关产品推荐

