在这个简化的示例中,我制作了一个UInt的propertyWrapper来保存自然数(整数> 0)。我自己的示例使用了更复杂的过滤器,但这显示了问题。问题的重点不是要找到解决方法,而是要阐明令人困惑的错误(对我而言)。
将其分配给简单的UInt会列出错误消息。
使用下面一行中的wrappedValue属性可以正常工作。但是,确定包装的全部目的是能够将其视为get返回的UInt吗?
错误“无法将类型'NonZero'的值分配给类型'UInt”似乎破坏了包装器类型的全部内容。我有什么误会? Xcode 11.0
import Foundation
@propertyWrapper
struct NonZero {
private let myNumber : UInt
init(n : UInt)
{
if ( n == 0){fatalError(" cannot be 0")}
myNumber = n
}
var wrappedValue: UInt {
get { return myNumber }
}
}
struct Nums {
var num :UInt
init( nz: NonZero){
num = nz //error message "cannot assign value of type 'NonZero' to type 'UInt"
num = nz.wrappedValue //no error
}
}
答案 0 :(得分:0)
这不是属性包装器的工作方式。代码:
init(nz: NonZero)
声明nz
具有类型NonZero
–只是前面定义的struct
,此处NonZero
未被用作包装属性。
包装的属性用作属性声明上的属性,例如:
@NonZero var num : UInt = 1
[将代码放入代码中需要将NonZero
的{{1}}的参数标签更改为init
,例如:
wrappedValue
]
您可以将init(wrappedValue : Uint) { ... wrappedValue ... }
的{{1}}写为:
init
继续探索!您可能会发现SE-0259 Property Wrappers(Apple)和Swift Property Wrappers(NSHipster)有用。
HTH