在swift中,展不能添加存储属性,Swift中可以使用Objective-C的关联对象(Associated Objects)的方式添加属性,弥补这一痛点
1、objc_setAssociatedObject
2、objc_getAssociatedObject
3、objc_removeAssociatedObjects
需要注意的是:objc_removeAssociatedObjects会删除对象关联的所有属性,所以可能导致把一些非自己添加的关联属性也删除掉。如果要删除某属性,使用objc_setAssociatedObject将value设置为nil即可
extension User {
private static var AGE_KEY:Bool = false
private static var WEIGHT_KEY: Bool = false
var newAge:Int {
get{
objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int ?? 0
}
set(n){
objc_setAssociatedObject(self, &Self.AGE_KEY, n, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
var address: String {
get{
objc_getAssociatedObject(self, &Self.WEIGHT_KEY) as? String ?? "暂无地址"
}
set{
objc_setAssociatedObject(self, &Self.WEIGHT_KEY, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
func removeAll() {
objc_removeAssociatedObjects(self)
}
func removeAge() {
objc_setAssociatedObject(self, &Self.AGE_KEY, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
使用:
let u = User()
print(u.newAge)
print(u.address)
u.newAge = 10
u.address = "address"
print(u.newAge)
print(u.address)
u.removeAge()
print(u.newAge)
print(u.address)
u.removeAll()
print(u.newAge)
print(u.address)
打印结果:
0
暂无地址
10
address
0
address
0
暂无地址
网友评论