美文网首页iOS面试
Swift-Runtime学习(获取类中所有属性名)

Swift-Runtime学习(获取类中所有属性名)

作者: SK丿希望 | 来源:发表于2018-05-21 16:04 被阅读30次

扩展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

相关文章

  • Swift-Runtime学习(获取类中所有属性名)

    扩展NSObject 使用(注意:要获取的类前必须添加@objcMembers 不然获取是空数组) 1.定义模型 ...

  • ruanTime使用

    获取类中的方法进行交换 通过字符串获取类名 获取属性的名称和类型

  • 看MJExtension源码之获取所有的属性

    思路 利用runtime获取所有的属性 注意点 为了保证获取到所有的属性,不仅要获取当前类的所有属性,还要获取其父...

  • oc-Runtime学习(获取类中所有属性名)

    类声明 类实现 外部使用 运行结果

  • Runtime 那些事儿 二

    1. 获取一个类的所有方法 2. 获取一个类的所有属性 3. 获取/设置类的属性变量 4. 判断类的某个属性的类型...

  • runtime基本用法

    1 当我们动态加载某个类的时候,可以用到runtime,可以便捷的获取到动态加载类的所有信息 (属性,属性名)

  • day13面向对象

    内置类属性 类.name :获取类的名字类.doc :获取类的说明文档类.dict :获取类中所有的类属性对应的值...

  • 3. 再谈spring IoC

    IoC实现原理 反射 : 在运行状态中,根据提供的类的路径或者类名,通过反射来动态的获取该类的所有属性和方法。 工...

  • 25、反射(一)

    上面学习了Class类,反射主要是用来获取到类的属性和方法。 几点说明: 另外一种获取class的方法: 类名.c...

  • 2019 面试前的准备 -- runtime

    runtime 笔记 获取类的所有属性和变量 class_copyIvarList 输出结果: 获取所有属性 cl...

网友评论

    本文标题:Swift-Runtime学习(获取类中所有属性名)

    本文链接:https://www.haomeiwen.com/subject/thxqjftx.html