Как создать экземпляр класса из строки в 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

Ответ 4

Я добавил свою категорию для преобразования классов здесь: fooobar.com/info/87858/...