我目前正在编写一个用于为我的OS X应用程序创建插件的框架。这些插件加载为NSBundle
s,捆绑包“principalClass
es用于运行插件代码。但是,我无法弄清楚如何声明principalClass
对象符合我的协议。
let bundles = CFBundleCreateBundlesFromDirectory(kCFAllocatorDefault, NSURL(fileURLWithPath: bundleDirectory), "bundle") as NSArray
for bundle in bundles
{
let bundleClass = bundle.principalClass!!
if (bundleClass.conformsToProtocol(MyProtocol.self))
{
//Produces compiler error:
//"Cannot downcast from 'AnyClass' to non-@objc protocol type 'MyProtocol'"
let loadedClass = bundleClass as MyProtocol
}
}
声明它是否符合此协议的正确语法是什么?
(另外,这个协议被声明为@objc
所以我不确定为什么它会说“非@objc”协议。)
答案 0 :(得分:3)
尝试:bundleClass as MyProtocol.Protocol
。文档here。
BTW,您的代码可以简化
let bundles = CFBundleCreateBundlesFromDirectory(kCFAllocatorDefault, NSURL(fileURLWithPath: bundleDirectory), "bundle") as NSArray
for bundle in bundles {
if let loadedClass = bundle.principalClass as? MyProtocol.Protocol {
// ...
}
}