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 关联对象