我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己的一份文档.
//
// 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 []
}
}