代码示例:
@propertyWrapper
struct Increase<T> {
var wrappedValue : T {
get {return value1}
set {
value1 = newValue
if T.self is Int.Type {
print("\(T.self)")
}
if T.self is NSObject.Type || T.self is (NSObject?).Type {
print("\(T.self)")
}
}
}
var projectedValue : Increase<T> {return self}
private var value1 : T
init(wrappedValue: T) {
self.value1 = wrappedValue
}
public func printValue() {
if let v = wrappedValue as? Int {
print("Increase: value=\(v+1)")
}
}
}
class SwiftTestObject : NSObject {
@Increase var wrappedInt : Int = 1
@Increase(wrappedValue: nil) var wrappedObject : NSObject?
func testFunc() {
self.wrappedObject. //NSObject
_wrappedObject //Increase<NSObject>
self.$wrappedObject. //Increase<NSObject>
}
}
- @propertyWrapper 来声明,必须带 泛型定义。
- 必须创建 var wrappedValue ,同时重写 set get方法。
- 在声明对应属性包装器 属性的class里,可以用 _value 来访问 Increase 对象。用 self.value 来访问对应的 T 类型对象
- 可以用 @Increase var value :int = 1. 或是 @Increase(wrappedValue: 1) var value : Int. 来声明并初始化
- 如果外面其他地方要访问 Increase 对象,必须在 propertyWrapper 里声明一个 projectedValue 来返回self,外面即可用 object.$value 语法糖来访问。