try 编写属性包装,如下所示:

@propertyWrapper struct LessThanSixteen<String> {
    var value: String
    
    var wrappedValue: String {
        get { value }
//        set { value = }
    }
    
    init(wrappedValue: String) {
        var x = wrappedValue
        self.value = (wrappedValue.count < 16) ? wrappedValue : wrappedValue.dropLast(wrappedValue.count - 16)
    }
}

self.value = (wrappedValue.count < 16) ? wrappedValue : wrappedValue.dropLast(wrappedValue.count - 16)行抛出了2个错误."‘字符串’类型的值没有成员‘count’","‘字符串’类型的值没有成员‘dropLast’".我不明白为什么编译器会这么说.

如果我在@propertyWrapper struct 之外编写以下代码:

let someString = "this string is more than 16 characters long"
let someSubstring = String(someString.dropLast(someString.count - 16))

我没有收到这样的编译器错误.我不明白为什么我不能在属性包装器中执行该代码.

推荐答案

struct LessThanSixteen<String>声明generic type,具有名为"字符串"的泛型类型参数,就像Array<Element>是具有名为Element的类型参数的泛型类型一样.

因此,属性包装中的单词String指的是泛型类型参数,而不是SWIFT内置的String类型(与之完全无关).

"可以对哪些类型的属性应用属性包装"不是由泛型类型参数确定的.它由wrappedValue的类型决定.当然,如果wrappedValue的类型是泛型类型参数,则可以将属性包装应用于类型与类型参数相同的属性.

如果你想要一个只在String上工作的属性包装,只需将wrappedValue设置为String即可.

@propertyWrapper struct LessThanSixteen {
    private var value: String
    
    var wrappedValue: String {
        get { value }
        set {
            value = String(newValue.prefix(16))
        }
    }
    
    init(wrappedValue: String) {
        var x = wrappedValue
        self.value = String(wrappedValue.prefix(16))
    }
}

Swift相关问答推荐

对多个项目的数组进行排序

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

如何使用AsyncTimerSequence获取初始时钟,然后在指定的时间间隔内开始迭代?

从Swift中的泛型类继承?

在数组中查找最大y值的x值

如何在macOS中延迟退出应用程序的退出操作?

UIImage和UIimage.pngData返回两个不同的图像

在 struct 中的序列和非序列泛型函数之间进行 Select

使用泛型的 Swift 枚举值

如何使用 Swinject 注册符合 ObservableObject 的协议?

不要从 NumberFormatter 获取货币符号

我们如何显示关于 UITextField 是 xCode Swift 的建议?

Vapor Swift 如何配置客户端连接超时

符合协议要求委托变量在 ios13 中可用

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

Swift 动画 WithDuration 语法是什么?

Swift:创建 UIImage 数组

如何在 Swift 中重写 setter

在情节提要中设置的 UITableViewCell 的恢复 ID 和标识符有什么区别

swift中的匿名类