为什么我们需要在 Swift propertyWrapper 中添加类型注释?

问题描述 投票:0回答:1

考虑这个@propertyWrapper:

@propertyWrapper struct Capitalized {
    var wrappedValue: String {
        didSet { wrappedValue = wrappedValue.capitalized }
    }
    init(wrappedValue: String) {
        self.wrappedValue = wrappedValue.capitalized
    }
}

这样使用:

struct User {
    @Capitalized var userName: String
}

我的问题是:

为什么我需要使用属性

userName
来指定类型注释。难道编译器不够聪明,推断出由于
wrappedValue
类型的
@Capitalized
String
,所以属性
userName
只能是
String
类型。

如果我省略类型注释,则会收到编译器错误:

模式中缺少类型注释

swift generics swift-property-wrapper
1个回答
0
投票

此处的诊断效果很差,无法指出实际问题。问题是,没有赋值的

@Capitalized
会转换为
Capitalized()
,并且没有这样的初始化器。您可以通过提供默认初始化程序来解决此问题:

@propertyWrapper struct Capitalized {
    ...

    init() { self.init(wrappedValue: "") }
}

有了这个,你的结构就很好了:

struct User {
    @Capitalized var userName
}

如果没有默认的

init()
,下面的也可以,因为它调用
Capitalized(wrappedValue:)
:

struct User {
    @Capitalized var userName = "bob"
}
© www.soinside.com 2019 - 2024. All rights reserved.