个人理解:属性包装器是对 set、get方法的封装,不同的属性有相似的set、get,使用属性包装器可以简化相似的代码。
有两个要求
- 必须使用属性@propertyWrapper进行定义。
- 它必须具有wrappedValue属性。
简单使用
使用@propertyWrapper创建一个 ClamppedValue,该结构体保证被封装的值number不能小于0大于255,如果我们存储的值大于255,那么属性返回255 小于0 返回 0
@propertyWrapper
struct ClamppedValue {
private var number: Int = 0
var wrappedValue: Int {
get {
return self.number
}
set {
if newValue < 0{
self.number = 0
}else if newValue > 255{
self.number = 255
}else{
self.number = newValue
}
}
}
init(wrappedValue initValue:Int) {
self.wrappedValue = initValue
}
}
struct MyColor {
@ClamppedValue var red: Int
@ClamppedValue var green: Int
@ClamppedValue var blue: Int
}
var setColor:MyColor = MyColor(red: 256, green: 50, blue: 50)
print("color red is \(setColor.red)") // 255
通过上面的代码可以看出:
- red和greed和blue初始值为0
- 设置greed为50,其值有效,满足条件,number将会被设置为50,所以打印为50
- 设置red为256,超过最大值255,所以number将会被设置为255,打印为255