Как создать экземпляр класса из строки в Swift
Я попытался создать экземпляр класса с использованием строки различными способами, при этом ни один из них не работает в Swift 3.
Ниже приведены предварительные решения 3, которые я пробовал, которые не работают
- Создание класса объектно-c-класса
@objc(customClass)
class customClass {
...
}
//Error here: cannot convert value of type 'AnyClass?' to expected argument type 'customClass'
let c: customClass = NSClassFromString("customClass")
- Указание класса с использованием значения NSString (как с атрибутом @objc, так и без него)
@objc(customClass)
class customClass {
...
}
//Error here: cannot convert value of type 'String' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
var className = NSStringFromClass("customClass")
let c: customClass = NSClassFromString(className)
Я ничего не делаю правильно, но не нашел никаких решений в Интернете.
Как создать экземпляр класса с помощью строки в Swift 3?
Ответы
Ответ 1
Вы можете попробовать следующее:
func stringClassFromString(_ className: String) -> AnyClass! {
/// get namespace
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
/// get 'anyClass' with classname and namespace
let cls: AnyClass = NSClassFromString("\(namespace).\(className)")!;
// return AnyClass!
return cls;
}
используйте func следующим образом:
class customClass: UITableView {
}
let myclass = stringClassFromString("customClass") as! UITableView.Type
let instance = myclass.init()
Ответ 2
Если проект содержит пробел, вы должны заменить пробел '_'
Что-то вроде этого
let namespace = (Bundle.main.infoDictionary!["CFBundleExecutable"] as! String).replacingOccurrences(of: " ", with: "_")
let cls = NSClassFromString("\(namespace).\(className)")! as! AnyClass
Ответ 3
Apple предоставляет способ добиться этого без использования NSClassFromString
.
Bundle.main.classNamed("MyClassName")
https://developer.apple.com/documentation/foundation/bundle/1407299-classnamed
Ответ 4
Я добавил свою категорию для преобразования классов здесь: fooobar.com/info/87858/...