Swift快速为类扩展属性
在程序编写过程中,我们常常需要为已有的类扩展新的属性。通常我们的解决办法是先声明一个Key,然后使用 使用首先我们来看看封装后如何使用。
extension View:Property{
var margin : Int{
get{ return get0() }
set{ set0(newValue)}
}
}
是不是非常简单?不过在使用这个Property之前,一定要看清楚注意事项哦。
var test : String{
get{ return get(&keyPoint) }
set{ set(&keyPoint,newValue)}
}
也还是比较简单的,毕竟为一个类扩展超过三个以上的属性的需求还是比较小的。 封装过程首先我们看看,扩展属性通常使用的代码 struct XKeys {
static var common : String = "common"
}
extension AbstractProtocol{
var common : String{
get{
return objc_getAssociatedObject(self,&XKeys.common) as! String
}
set{
objc_setAssociatedObject(self,&XKeys.common,newValue,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
在复制粘贴了多次这样的代码之后,我实在厌倦了这样扩展属性的方式,然后开始了自己的封装。 最开始封装Property的时候是直接声明了一个类,写了一些静态方法。然后在get set中调用。 class Property2 {
static func get<T : Any>(_ key: UnsafeRawPointer) -> T{
return objc_getAssociatedObject(self,key) as! T
}
static func set<T : Any>(_ key: UnsafeRawPointer,_ newValue : T) {
objc_setAssociatedObject(self,key,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
不过测试过程中发现一些问题,这个self实际应该使用被扩展的对象的类的self,所以经过修改后,代码如下: class Property2 {
static func get<T : Any>(_ o : Any,_ key: UnsafeRawPointer) -> T{
return objc_getAssociatedObject(o,key) as! T
}
static func set<T : Any>(_ o : Any,_ key: UnsafeRawPointer,_ newValue : T) {
objc_setAssociatedObject(o,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
调用的时候: var common : String{
get{
return Property2.get(self,&XKeys.common)
}
set{
Property2.set(self,newValue)
}
}
感觉封装了跟没封装基本差不多啊。 // Property.swift
//
// Created by Fancy on 26/1/18.
// Copyright ? 2018年 Artifex Software,Inc. All rights reserved.
import UIKit
struct PropertyKey{
static var key0 : Void?
static var key1 : Void?
static var key2 : Void?
}
protocol Property{}
extension Property{
func get<T : Any>(_ key: UnsafeRawPointer) -> T{
return objc_getAssociatedObject(self,key) as! T
}
func set<T : Any>(_ key: UnsafeRawPointer,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
func get0<T : Any>() -> T{
return objc_getAssociatedObject(self,&PropertyKey.key0) as! T
}
func set0<T : Any>(_ newValue : T) {
objc_setAssociatedObject(self,&PropertyKey.key0,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
func get1<T : Any>() -> T{
return objc_getAssociatedObject(self,&PropertyKey.key1) as! T
}
func set1<T : Any>(_ newValue : T) {
objc_setAssociatedObject(self,&PropertyKey.key1,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
func get2<T : Any>() -> T{
return objc_getAssociatedObject(self,&PropertyKey.key2) as! T
}
func set2<T : Any>(_ newValue : T) {
objc_setAssociatedObject(self,&PropertyKey.key2,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
结语整个封装过程没有什么高科技含量的操作,写文章做点记录,希望能给到需要的人帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
