考虑这个@ 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指定类型注释.编译器是否足够聪明,可以推断出由于@CapitalizedwrappedValue类型是String,所以属性userName只能是String类型.

如果我忽略了类型注释,就会得到编译器错误:

模式中缺少类型注释

推荐答案

这里的诊断是不好的,并没有指出你的实际问题.问题是没有赋值的@Capitalized转换为Capitalized(),并且没有这样的初始化器.您可以通过提供默认的初始化器来修复此问题:

@propertyWrapper struct Capitalized {
    ...

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

有了这个,你的 struct 就很好了:

struct User {
    @Capitalized var userName
}

如果没有默认值init(),下面的命令也可以,因为它调用Capitalized(wrappedValue:):

struct User {
    @Capitalized var userName = "bob"
}

Swift相关问答推荐

如何取消正在视图修改器中运行的任务

Swift UI在视图中排序不同的 struct

UITableView未显示类数组数据

如何分解阿拉伯字母?

使用MKLocalSearch获取坐标

在Xcode SWIFT中运行用Ionic编写的函数

调度组是否阻止iOS中的主线程?

是否可以使用一个 NSRegularExpression 同时判断字符串格式并提取子字符串?

按数组大小进行类型判断?

ToolbarItem 包含在动画中但不应该包含在动画中

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

如何使用Swift宏和@Observable和@Environment?

如何测试可选 struct 的协议一致性

如何避免从模块导入函数

在 SwiftUI 中的 ForEach 中使用 id 时如何为数组设置动画索引

将 struct 作为泛型类型传递并访问该泛型类型属性

将数据附加到 Firebase 实时数据库后,NavigationLink 将我重定向到上一个视图

在 Swift 框架中加载资源(例如故事板)

修复 Swift 3 中的警告C-style for Statement is deprecated

Swift performSegueWithIdentifier 不起作用