swift-30运行时加载属性列表

171 阅读2分钟

我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己的一份文档.

image.png

image.png

//
//  Person.swift
//  14运行时加载属性列表

import UIKit

class Person: NSObject {
    var name: String?
    
    //基本数据类型 在oc中没有可选 如果定义可选 运行时同样获取不到 使用KVC 就会奔溃
    //var age: Int? 定义基本数据类型 运行时获取不到
    var age: Int = 0
    var title: String?
    
    class func propertyList() -> [String] {
        var count: UInt32 = 0
        
        //1 获取 类 的属性列表 返回属性列表的数组 可选项
        // 方法返回值为 UnsafeMutablePointer<objc_property_t?>?
        // 注意点 c语言 对象记得要释放
        // 获取 ivar 列表是所有第三方框架字典转模型的基础
        let list = class_copyPropertyList(self, &count)
        
        /**
        class_copyIvarList(<#T##cls: AnyClass!##AnyClass!#>, <#T##outCount: UnsafeMutablePointer<UInt32>!##UnsafeMutablePointer<UInt32>!#>)
        class_copyMethodList(<#T##cls: AnyClass!##AnyClass!#>, <#T##outCount: UnsafeMutablePointer<UInt32>!##UnsafeMutablePointer<UInt32>!#>)
        class_copyPropertyList(<#T##cls: AnyClass!##AnyClass!#>, <#T##outCount: UnsafeMutablePointer<UInt32>!##UnsafeMutablePointer<UInt32>!#>)
         */
        
        print("属性列表的数量 \(count)")
        
        //2 遍历数组
//        for i in 0..<Int(count) {
//            //3 根据下标获取属性
//            //objc_property_t?
//            let pty = list?[i]
//            
//            //4 获取属性 的名称 c语言字符串
//            // UnsafePointer<Int8>?
//            // Int8 -> Byte -> Char C语言的字符串
//            let cName = property_getName(pty!)
//            
//            //5 转换成 String 的字符串
//            let name = String(utf8String: cName!)
//            
//            print(name)
//        }
        
        //2 遍历数组
        for i in 0..<Int(count) {
            //3 根据下标获取属性
            // 使用 guard 语法 依次判断每一项是否有值 只要有一项为nil 就不要执行后续的代码
            guard let pty = list?[i],
                let cName = property_getName(pty),
                let name = String(utf8String: cName)
                
                else {
                //继续遍历下一个
                    continue
            }
            print(name)
        }
        //3 释放c语言的对象
        free(list)
        return []
    }

}