试着像这样写一个属性 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 器中执行这些代码。
1条答案
按热度按时间lp0sw83n1#
struct LessThanSixteen<String>
声明了一个 * 泛型类型 *,泛型类型参数名为“String”,就像Array<Element>
是一个泛型类型,类型参数名为Element
一样。因此,属性 Package 器中的单词
String
指的是泛型类型参数,而不是Swift内置的String
类型(并且与之完全无关)。“属性 Package 器可以应用于哪些类型的属性”不是由泛型类型参数决定的。它是由
wrappedValue
的类型决定的。当然,如果wrappedValue
的类型是泛型类型参数,那么属性 Package 器可以应用于具有类型参数可以是的类型的属性。如果您想要一个只在
String
s上工作的属性 Package 器,只需将wrappedValue
设置为String
。字符串