Swift4.0 用运行时访问类的属性

作者: Pei丶Code | 来源:发表于2017-11-17 19:49 被阅读698次

    谨以此记录Swfit4.0的学习过程

    类的属性前面需要加上@objc关键词或者类前面加上@objcMembers ,否则运行时访问不了类的属性

    image.png

    原因:在Swift 4中继承 NSObject 的 swift class 不再默认全部 bridge 到 OC,如果我们想要使用的话我们就需要在class前面加上@objcMembers 这么一个关键字。

    引用: 在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另外一种方式:继承 NSObject。class 继承了 NSObject 后,编译器就会默认给这个类中的所有函数都标记为 @objc ,支持 OC 调用。苹果在Swift 4 中苹果修改了自动添加 @objc 的逻辑:一个继承 NSObject 的 swift 类不再默认给所有函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。

    import UIKit
    //需要加上@objcMembers 这么一个关键字。
    @objcMembers class Student: NSObject {
        var name :String?
        var age : Int = 18
        var title = "I like League of legend"
        var a:String?
        ///[使用运行时]获取当前类所有的属性数组
        class func propertyList() -> [String] {
            var count :UInt32 = 0
            //获取‘类’的属性列表
            let list = class_copyPropertyList(self, &count)
            print("属性的数量\(count)")
            for i in 0..<Int(count) {
                //根据下标 获取属性
                let a = list?[i]
                //获取属性的名称
                let cName = property_getName(a!)
                let n = String(utf8String:cName)
                print(cName)
                print(n as Any)
                print("hhh")
            }
            return [];
        }
    }
    

    注:之前用KVC赋值时就遇到过这个问题,原因同上;

    相关文章

      网友评论

      • 英俊神武:cName 这个你打印出来是中文吗
      • 游龙飞雪:我也遇到了同样的问题,感谢楼主分享!
        只是String的构造方法还是不同,变为对象方法了。
        这两种写法结果是一样的

        let ptyName = String.init(utf8String: cName)
        print(ptyName!)

        let ptyName2 = String(cString: cName)
        print(ptyName2)
      • dulllight:补充一点,swift4中对于用private修饰的属性,即使在类前用objcMembers修饰也无法通过objc_getPropertyList获取,此时只能用objc_getIvarList获取。如果想要用objc_getPropertyList获取,则需要用objc来修饰该属性才行。
        Superman168:我想问一下,你这两个方法objc_getPropertyList和objc_getIvarList,是怎么调的?
        Pei丶Code:@游龙飞雪 ::fist:
        游龙飞雪:多谢分享,共同进步!
      • Persistence__:这篇文章很及时的解答了我的问题,本人刚接触swift,还在看3.0的视频,我遇到的情况和楼主一样,属性个数为0,正纳闷呢,看到楼主文章,豁然开朗
        英俊神武:我也在看这个视频,视频讲得挺好的
        Pei丶Code:@Persistence__ 有帮助就好,我也正在学

      本文标题:Swift4.0 用运行时访问类的属性

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