swift 中属性包装器的使用说明
1. 什么是 @propertyWrapper
这是用来定义一个属性包装器结构的关键字.
2. @propertyWrapper使用方式
@propertyWrapper
struct LimitNumber {
...
}
3. 属性包装有什么用处
大体来说主要有几个用处:限制边界,减少错误,编码简洁,可读性更好。
4. 如何使用-举例说明
首先定义了一个用来存放数值的类型,但是该类型的数值是有范围要求的。
//该struct用来存放可以限制范围的数值
@propertyWrapper
struct LimitNumber {
private var _number:Int
private var _maximum:Int
private var _minimum:Int
var projectedValue = "我是映射值:projectedValue" //该变量名固定 可以用$访问
//属性包装的结构体中,必须存在一个名为wrappedValue的属性
var wrappedValue: Int { //该属性名称固定,必须存在
get {return _number}
set {
print("LimitNumber: wrappedValue setter ...max=\(_maximum),min=\(_minimum),num=\(_number),newValue=\(newValue)")
if(_minimum..._maximum).contains(newValue){
_number = newValue
} else {
print("WARNING:给定数值:\(newValue) ,超出范围限制\(_minimum)...\(_maximum), 已被忽略。")
}
}
}
init() {
print("LimitNumber: init()")
_maximum = 10
_minimum = 0
_number = 0;
}
init(minimum:Int,maximum:Int) {
print("LimitNumber: init(minimum:\(minimum),maximum:\(maximum))")
_maximum = maximum
_minimum = minimum
_number = minimum;
}
init(minimum:Int,maximum:Int,number:Int) {
print("LimitNumber: init(minimum:Int,maximum:Int,number:Int)")
_maximum = maximum
_minimum = minimum
_number = minimum; //如果不为_number初始化值,使用self会出错:self used before all stored properties are initialized
self.wrappedValue = number;
}
}
接下来定义一个类型,用来表示一个人的身高和体重, 并且使用上面已经定义的属性包装器来限制数值的范围。
struct PersonSize {
//使用包装属性限制身高的可设定范围
@LimitNumber(minimum: 29, maximum: 230) var height: Int {
willSet{print("PersonSize->height->willSet")}
}
//使用包装属性限制体重的可设定范围
@LimitNumber(minimum: 2, maximum: 1000) var weight: Int{
willSet{print("PersonSize->weight->willSet")}
}
}
现在这个PersonSize类型就可以使用了
//struct 会自动生成隐式的初始化函数 Person(size: PersonSize, name: String)
struct Person {
var size:PersonSize
var name:String
}
let size = PersonSize()
var p1 = Person(size: size, name: "jone")
p1.size.height = 180
p1.size.weight = 1
p1.size.weight = 90
print(p1.size.$height) //此处为映射值的测试代码
运行执行结果如下:
LimitNumber: init(minimum:29,maximum:230)
LimitNumber: init(minimum:2,maximum:1000)
PersonSize->height->willSet
LimitNumber: wrappedValue setter ...max=230,min=29,num=29,newValue=180
PersonSize->weight->willSet
LimitNumber: wrappedValue setter ...max=1000,min=2,num=2,newValue=1
WARNING:给定数值:1 ,超出范围限制2...1000, 已被忽略。
PersonSize->weight->willSet
LimitNumber: wrappedValue setter ...max=1000,min=2,num=2,newValue=90
我是映射值:projectedValue
你们觉得这个图片我用手机拍的效果怎么样?
–
!!!
版权声明:本文为xuanwenchao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。