我刚接触Typhoon,似乎不知道如何正确加载Configuration.plist。我的项目是以Swift PocketForecast示例为模型的,尽管我从自己的基于CocoaPods的项目开始,并自己添加了Typhoon(即,我不是从克隆的PocketForecastProject开始的)。我将plist集成用于多个程序集。
当我使用这个:
public dynamic func config() -> AnyObject {
return TyphoonDefinition.configDefinitionWithName("Configuration.plist")
}
我收到一个找不到文件的错误,在调试器中我可以看到它使用的路径是"/path/to/MyProject.app/Frameworks/Typhoon.framework",但我的配置文件当然不在那里,它位于"/path_to/MyProject/app/Configuration.plist"。是的,我已经确认文件确实在那里。
我试图通过做这样的事情来解决这个问题:
public dynamic func config() -> AnyObject {
return TyphoonDefinition.withClass(TyphoonConfigPostProcessor.self) {
(definition) in
definition.injectMethod("useResourceAtPath:") {
(method) in
method.injectParameterWith(self.configURL())
}
}
}
public dynamic func configURL() -> AnyObject {
return TyphoonDefinition.withFactory(self.configBundle(), selector: "URLForResource:withExtension:", parameters: {
(initializer) in
initializer.injectParameterWith("Configuration")
initializer.injectParameterWith("plist")
})
}
public dynamic func configBundle() -> AnyObject {
return TyphoonDefinition.withClass(NSBundle.self) {
(definition) in
definition.useInitializer("mainBundle")
}
}
奇怪的是,这有时也能奏效。它看起来是随机的,并且基于我的其他台风组件的装载顺序。换句话说,有时一切都很好,但有时Typhoon初始化会出现各种不同的错误,比如"没有组件匹配id XYZ"或"在配置中找不到值"。但正如我所说,有时它还可以。
我一定错过了台风如何初始化的一些基本部分,所以非常感谢任何帮助!
编辑:所以,经过一番摸索,我上面尝试的第一个方法似乎失败了,因为CocoaPods在Swift项目中使用框架而不是静态库的问题?我在台风中发现了这个代码来源:
+ (id <TyphoonResource>)withName:(NSString *)name
{
return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]];
}
由于[self class]
将解析为Typhoon框架内的一个类,我想我明白为什么它是捆绑包,它是它正在使用的捆绑包,但对我来说这似乎是一个bug。我想看看我是否能弄清楚为什么这不会破坏PocketForecast应用程序。
这是3.0.1台风中的一个错误。正如您所指出的,当Typhoon被链接为Swift框架时,TyphoonConfiguration资源使用了错误的捆绑包。这已在3.0.2号台风中得到纠正。