美文网首页swift
运行时加载属性列表、Swift4中的 @objcMembers

运行时加载属性列表、Swift4中的 @objcMembers

作者: ibiaoma | 来源:发表于2018-03-08 16:15 被阅读1331次
        基本代码     
     import UIKit
    @objcMembers class Person: NSObject {
    var name : String?
    var age : Int = 0
    //private var title : String?
    //private 的属性,使用运行时,同样获取不到属性(可以获取到ivar),使用KVC会崩溃
    var title : String?
    //使用运行时获取当前类的所有属性的数组
    class func propertyList() -> [String]{
        var count : UInt32 = 0
        let list = class_copyPropertyList(self, &count)
        print(#function, "属性的数量\(count)")
        for i in 0..<Int(count) {
            let pty = list?[i]
            let cName = property_getName(pty!)
            let name = String(utf8String: cName)
            print(#function, "\(name ?? "")")
        }
    
        //使用 guard
        for i in 0..<Int(count) {
            guard let pty: objc_property_t = list?[i],
                let cName: UnsafePointer<Int8> = property_getName(pty),
                let name:String = String(utf8String: cName)
                else{
                    continue
            }
            print(#function, "\(name)")
        }
        free(list)
        return []
    }
    }
    

    原因:
    @objcMembers 在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 标识。

    相关文章

      网友评论

        本文标题:运行时加载属性列表、Swift4中的 @objcMembers

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