为Swift String编写属性 Package 器时遇到问题

bfnvny8b  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(50)

试着像这样写一个属性 Package 器:

@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个错误。“类型'String'的值没有成员'count'”和“类型'String'的值没有成员'dropLast'”。我不明白编译器为什么这么说。
如果我在@propertyWrapper结构体外部编写以下代码:

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


我没有得到这样的编译器错误。我不明白为什么我不能在属性 Package 器中执行这些代码。

lp0sw83n

lp0sw83n1#

struct LessThanSixteen<String>声明了一个 * 泛型类型 *,泛型类型参数名为“String”,就像Array<Element>是一个泛型类型,类型参数名为Element一样。
因此,属性 Package 器中的单词String指的是泛型类型参数,而不是Swift内置的String类型(并且与之完全无关)。
“属性 Package 器可以应用于哪些类型的属性”不是由泛型类型参数决定的。它是由wrappedValue的类型决定的。当然,如果wrappedValue的类型是泛型类型参数,那么属性 Package 器可以应用于具有类型参数可以是的类型的属性。
如果您想要一个只在String s上工作的属性 Package 器,只需将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))
    }
}

字符串

相关问题