Swift 具有@PropertyRapper成员的结构的合成初始化

Swift 具有@PropertyRapper成员的结构的合成初始化,swift,swiftui,swift5.1,Swift,Swiftui,Swift5.1,SwiftUI的@State属性包装器有什么神奇之处?这意味着我可以做到这一点: 结构A{ @状态变量s:String } 设a=a(s:“string”)//对`a`使用合成的init,这允许我使用底层类型`a.s`-a`string初始化a` 但是如果我玩我自己的@propertyRapper,我不能 @propertyWrapper 结构支柱{ var值:value var wrappedValue:Value{ 获取{value} 设置{value=newValue} } } 结构B{

SwiftUI的
@State
属性包装器有什么神奇之处?这意味着我可以做到这一点:

结构A{ @状态变量s:String } 设a=a(s:“string”)//对`a`使用合成的init,这允许我使用底层类型`a.s`-a`string初始化a` 但是如果我玩我自己的
@propertyRapper
,我不能

@propertyWrapper
结构支柱{
var值:value
var wrappedValue:Value{
获取{value}
设置{value=newValue}
}
}
结构B{
@属性var s:字符串
}
设b=b(s:“string”)//编译器错误:`无法将'string'类型的值转换为预期的参数类型'Prop'`
让b=b(s:Prop(value:“string”)//可以工作,但很难看
如中所述:

。。。可以让编译器为您执行此操作,就像它对
@State
所做的那样-只需在属性包装定义中添加一个特定的magic
init(wrappedValue:)

@propertyWrapper
结构支柱{
var值:value
var wrappedValue:Value{
获取{value}
设置{value=newValue}
}
//魔汁
init(wrappedValue:Value){
self.value=wrappedValue
}
}
结构B{
@属性var s:字符串
}
让b=b(s:“string”)//现在可以工作了
顺便说一句,这还允许您为结构定义中的包装属性指定默认值:

结构B{ @Prop var s:String=“default value”//now工作;以前可能会抛出编译器错误 } 记录