Swift Runtime

Swift 运行时是支持 Swift 代码在应用程序执行期间运行的环境。它负责管理内存、类型信息、动态派发、反射等。它的主要功能是为 Swift 程序提供必要的支持,以便其在实际设备上运行。

1. 类型信息。可以使用 type(of:) 函数来获取对象的类型。

let variable = 1 let typeInfo = type(of: variable) print(typeInfo)

2. 动态派发。动态派发指的是在运行时决定要调用哪个方法。Swift 中通过 @objc 和 dynamic 关键字来实现动态派发。使用 @objc 关键字可以使方法可以被 Objective-C 运行时系统调用,而 dynamic 关键字强制 Swift 使用动态派发。

class Example { var a: Int = 1 @objc dynamic func sayHello() { print("Hello, World!") } } func invokeMethod(object: AnyObject, methodName: String) { let selector = NSSelectorFromString(methodName) if object.responds(to: selector) { object.perform(selector) } else { print("Method not found") } } let example = Example() invokeMethod(object: example, methodName: "sayHello")

3. Mirror 反射。Swift 中的 Mirror 类型用于反射(Reflection),它允许您在运行时检查和操作对象的结构。通过 Mirror,您可以获取对象的类型信息、属性和值,这对于调试、序列化、对象比较等任务非常有用。

let mirror = Mirror(reflecting: example) for child in mirror.children { if let label = child.label { print("\(label): \(child.value)") } } //使用 Mirror 进行 JSON 序列化 func toJSON(_ object: Any) -> String? { let mirror = Mirror(reflecting: object) var dict = [String: Any]() for child in mirror.children { if let label = child.label { dict[label] = child.value } } guard let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) else { return nil } return String(data: jsonData, encoding: .utf8) } let person = Example() if let jsonString = toJSON(person) { print(jsonString) }


Runtime 相关:Swift 关联对象