美文网首页
swift-30运行时加载属性列表

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

作者: sunmumu1222 | 来源:发表于2017-08-30 10:24 被阅读17次

    我以前做的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 []
        }
    
    }
    

    相关文章

      网友评论

          本文标题:swift-30运行时加载属性列表

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