ios - for - NSClassFromString() siempre devuelve nil
xcode requirements (3)
Este puede ser un problema que su clase no haya extendido desde NSObject. Como por defecto swift no tiene superclase.
El siguiente código se imprime en nil
, a pesar de que ListCell
es una clase válida.
var lCellClass : AnyClass! = NSClassFromString("ListCell");
println(lCellClass);
Los documentos están diciendo que el método devuelve
El objeto de clase nombrado por aClassName , o
nil
si no hay ninguna clase con ese nombre cargada actualmente. Si aClassName esnil
, devuelvenil
.
También traté de obtener NSClassFromString()
del controlador de vista actual que está CARGADO pero aún así no tengo nada.
Cual puede ser el problema ?
Actualización: Incluso tratando de hacer esto NSClassFromString("Array")
todavía tengo nil
La función NSClassFromString
funciona para las clases swift (puras y derivadas de Objective-C), pero solo si usa el nombre completo.
Por ejemplo, en un módulo llamado MyApp
con una clase swift pura llamada Person
:
let personClass: AnyClass? = NSClassFromString("MyApp.Person")
El nombre del módulo se define mediante la configuración de compilación "Nombre del módulo del producto" ( PRODUCT_MODULE_NAME
), generalmente el mismo nombre que el objetivo (con cierta normalización aplicada, por ejemplo, para eliminar espacios).
Esto es atípico, pero si la clase que está cargando está en el módulo actual y no sabe el nombre del módulo en tiempo de compilación, por ejemplo, porque el código se compila como parte de múltiples objetivos, puede buscar el nombre del paquete dinámicamente , que generalmente corresponde al nombre del módulo:
let moduleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
let personClass: AnyClass? = NSClassFromString(moduleName + "." + "Person")
Sin embargo, no recomiendo esto a menos que realmente no lo sepas en tiempo de compilación.
Para obtener más información, consulte Uso de nombres de clase de Swift con API Objective-C en Uso de Swift con Cocoa y Objective-C .
También es posible especificar un nombre para el símbolo en Objective-C que omita el espacio de nombres en el objetivo C usando la anotación @objc. Si prefiere usar el nombre sin el módulo, solo use el mismo nombre de clase:
@objc(Foobar)
class Foobar{
}
NSClassFromString ("Foobar") devolverá la clase Foobar.