You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:35:07