扩展NSObject
extension NSObject{
/**
获取对象对于的属性值,无对于的属性则返回NIL
- parameter property: 要获取值的属性
- returns: 属性的值
*/
func getValueOfProperty(property:String)->AnyObject?{
let allPropertys = self.getAllPropertys()
if(allPropertys.contains(property)){
return self.value(forKey: property) as AnyObject
}else{
return nil
}
}
/**
设置对象属性的值
- parameter property: 属性
- parameter value: 值
- returns: 是否设置成功
*/
func setValueOfProperty(property:String,value:AnyObject)->Bool{
let allPropertys = self.getAllPropertys()
if(allPropertys.contains(property)){
self.setValue(value, forKey: property)
return true
}else{
return false
}
}
/// 获取对象的所有属性名称 注意:必须在获取类的class前添加 (@objcMembers)不然获取为空数组 例:@objcMembersclass Person: NSObject
func getAllPropertys()->[String]{
// 这个类型可以使用CUnsignedInt,对应Swift中的UInt32
var count: UInt32 = 0
let properties = class_copyPropertyList(Person.self, &count)
var propertyNames: [String] = []
// Swift中类型是严格检查的,必须转换成同一类型
for i in 0..<Int(count) {
// UnsafeMutablePointer<objc_property_t>是
// 可变指针,因此properties就是类似数组一样,可以
// 通过下标获取
let property = properties![i]
let name = property_getName(property)
// 这里还得转换成字符串
let strName = String(cString: name) //String.fromCString(name);
propertyNames.append(strName);
}
// 不要忘记释放内存,否则C语言的指针很容易成野指针的
free(properties)
return propertyNames;
}
}
使用(注意:要获取的类前必须添加@objcMembers 不然获取是空数组)
1.定义模型
import UIKit
@objcMembers class Person: NSObject {
var name: String = ""
var hasBMW = false
let abg = "12414"
}
2.调用
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p = Person()
p.name = "Lili"
for name in p.getAllPropertys() {
print("\(name) : \(p.getValueOfProperty(property: name) ?? "" as AnyObject)")
}
}
}
3.打印结果
image.png
网友评论