NSClassFromString()始终返回nil

tes*_*sla 16 xcode ios ios7 xcode5 swift

nil尽管ListCell是有效的类,但仍打印以下代码.

var lCellClass : AnyClass! = NSClassFromString("ListCell");

println(lCellClass);
Run Code Online (Sandbox Code Playgroud)

文档说该方法返回

aClassName命名的类对象,或者nil当前没有加载该名称的类.如果aClassNamenil,则返回nil.

我也尝试获得NSClassFromString()当前的viewcontroller,它已经加载但仍然可以获得nil

可能是什么问题?

更新: 即使尝试这样做NSClassFromString("Array")我仍然得到nil

Jac*_*nce 63

NSClassFromString功能确实为(纯和Objective-C派生)迅速类工作,但是只有当你使用完全合格的名称.

例如,在一个名为MyApppure swift类的模块中调用Person:

let personClass: AnyClass? = NSClassFromString("MyApp.Person")
Run Code Online (Sandbox Code Playgroud)

模块名称由"产品模块名称"(PRODUCT_MODULE_NAME)构建设置定义,通常与目标名称相同(应用了一些规范化,例如删除空格).

这是非典型的,但是如果您正在加载的类在当前模块中并且您在编译时不知道模块名称,例如因为代码是作为多个目标的一部分编译的,那么您可以动态地查找包名称,通常对应于模块名称:

let moduleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
let personClass: AnyClass? = NSClassFromString(moduleName + "." + "Person")
Run Code Online (Sandbox Code Playgroud)

我不推荐这个,除非你在编译时真的不知道.

有关更多信息,请参阅在Swift使用带有Objective-C API的Swift类名和Cocoa和Objective-C.

  • 有趣!感谢那. (2认同)

Osm*_*und 13

也可以在Objective-C中为符号指定一个名称,它使用@objc注释省略了目标C中的名称空间.如果您更喜欢使用不带模块的名称,只需使用相同的类名:

@objc(Foobar)
class Foobar{

}
Run Code Online (Sandbox Code Playgroud)

NSClassFromString("Foobar")将返回Foobar类.