Swift声明AnyClass对象实现协议

时间:2014-12-05 17:53:41

标签: swift protocols

我目前正在编写一个用于为我的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”协议。)

1 个答案:

答案 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 {
        // ...
    }
}