You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.5 KiB
50 lines
1.5 KiB
//
|
|
// ClassLoader.swift
|
|
// LeStorage
|
|
//
|
|
// Created by Laurent Morvillier on 22/11/2024.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class ClassLoader {
|
|
static var classCache: [String : AnyClass] = [:]
|
|
|
|
static func getClass(_ className: String, classProject: String? = nil) -> AnyClass? {
|
|
if let cachedClass = classCache[className] {
|
|
return cachedClass
|
|
}
|
|
|
|
if let bundleName = Bundle.main.infoDictionary?["CFBundleName"] as? String {
|
|
let sanitizedBundleName = bundleName.replacingOccurrences(of: " ", with: "_")
|
|
let fullName = "\(sanitizedBundleName).\(className)"
|
|
if let projectClass = _getClass(fullName) {
|
|
return projectClass
|
|
}
|
|
}
|
|
|
|
if let classProject {
|
|
let sanitizedBundleName = classProject.replacingOccurrences(of: " ", with: "_")
|
|
let fullName = "\(sanitizedBundleName).\(className)"
|
|
if let projectClass = _getClass(fullName) {
|
|
return projectClass
|
|
}
|
|
}
|
|
|
|
let leStorageClassName = "LeStorage.\(className)"
|
|
if let projectClass = _getClass(leStorageClassName) {
|
|
return projectClass
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
static func _getClass(_ className: String) -> AnyClass? {
|
|
if let loadedClass = NSClassFromString(className) {
|
|
classCache[className] = loadedClass
|
|
return loadedClass
|
|
}
|
|
return nil
|
|
}
|
|
|
|
}
|
|
|