定义
管理属性如何存储和定义属性的代码之间添加一个分隔层,需存在一个wrappedValue属性的结构体,在结构体顶部使用@propertyWrapper修饰
//定义包装器,确保number值小于12
@propertyWrapper
struct TwelveOrLess {
private var number = 0
private var maximum: Int
private var minimum: Int = 0
var projectedValue: SmallNumber{ self } //属性定义,必须为projectedValue 模拟alamofire中protected举例
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
//当需要给属性包装器设置初值时,构造器会被调用
init(wrappedValue: Int) {
maximum = 12
number = min(wrappedValue, maximum)
}
//此属性包装器支持调用时赋初值不考虑wrappedValue参数
init(wrappedValue: Int, maximum: Int) {
self.maximum = maximum
number = min(wrappedValue, maximum)
}
init(minimum: Int, maximum: Int) {
self.maximum = min(maximum, 12)
self.minimum = min(minimum, 12)
self.number = min(minimum, 12)
}
func method1() -> Void {
}
}
//在struct中使用包装器
struct SmallRectangle {
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int = 1 //调用上面包装器中init(wrappedValue: Int)构造方法
@TwelveOrLess(minimum: 2, maximum: 5) var reset: Int //调用上面包装器中 init(minimum: Int, maximum: Int)构造方法
@TwelveOrLess(maximum: 5) var reset: Int //调用上面包装器中 init(wrappedValue: Int, maximum: Int)构造方法
}
var rectangle = SmallRectangle()
print(rectangle.height)
// 打印 "0"
rectangle.height = 10
print(rectangle.height)
// 打印 "10"
rectangle.height = 24
print(rectangle.height)
// 打印 "12"
$height.method1() //$height将会取到包装器中定义的projectedValue
属性包装器,一定要定义为属性哟!
网友评论