[Swift 开发] 深拷贝一个UILabel

来源:互联网 发布:4*4 矩阵开关 编辑:程序博客网 时间:2024/06/06 00:31

深拷贝一个UILabel

原理还是用到runtime的反射机制和NSCopying协议.

extension UILabel:NSCopying{    public func copy(with zone: NSZone? = nil) -> Any {                let label = UILabel()                var outCount:UInt32                var propertyArray:[NSString] = [NSString]()                outCount = 0                let peopers:UnsafeMutablePointer<objc_property_t?>! =  class_copyPropertyList(UILabel.classForCoder(), &outCount)                let count:Int = Int(outCount);                for i in 0...(count - 1)        {            let method = peopers[i]                        let sel = method_getName(method)                        let methodName = sel_getName(sel)                        if let name = methodName            {                let na:NSString = NSString.init(utf8String: name)!                                propertyArray.append(na);            }        }                // 不要忘记释放内存,否则C语言的指针很容易成野指针的        free(peopers)                for i in 8...(count - 6)        {            let name  = propertyArray[i]            let value = self.value(forKey: name as String)            label.setValue(value, forKey: name as String)        }                return label    }}

调用
let labelA = UILabel()let labelB =  labelA.copy() as! UILabel 

同理也可以深拷贝其他类型

原创粉丝点击