我正在使用Typhoon库来进行依赖注入框架.我CocoaPod
用来安装这个库.这是我的pod文件:
target "typhoon-swift-demo" do
pod 'Typhoon'
end
target "typhoon-swift-demoTests" do
end
Run Code Online (Sandbox Code Playgroud)
我已成功安装,但是当我打开工作区项目文件时.我键入这些代码行作为Typhoon示例代码:
public class ApplicationAssembly: TyphoonAssembly {
}
Run Code Online (Sandbox Code Playgroud)
我遇到错误,我的应用程序无法识别TyphoonAssembly
我试图使用一些行,如:
import Typhoon // not recogize typhoon
import TyphoonAssembly // not regconize
Run Code Online (Sandbox Code Playgroud)
请告诉我如何解决这个问题.在使用库之前我应该添加什么.谢谢 :)
如何将Typhoon与iOS故事板一起使用,其中视图控制器由系统隐式生成?我是否必须在prepareForSegue方法中做一些特别的事情?
我正在使用Swift与Typhoon和Cocoapods.一切顺利,直到我开始为我的Typhoon组件编写Integrationtest(根据Typhoon-Example-App测试).我想以与我在TyphoonFactory
中的setUp()
方式相同的方式设置Test 方法AppDelegate
.当我执行测试时,我总是得到一个
TyphoonBlockComponentFactory assertIsAssembly:] + 244:错误:MyApp.MyAssembly不是TyphoonAssembly的子类
Typhoon引发的错误(使用kindOfClass
引擎盖下的方法.)相同的代码完美地工作AppDelegate
,我无法弄清楚什么是错的.
为了验证这种行为,我实现了isKindOfClass
检查booth类(参见下面的代码):
有人可以帮助我吗?多谢!
PodFile
inhibit_all_warnings!
target "MyApp" do
pod 'Typhoon', '2.1.0'
end
target "MyAppTests" do
pod 'Typhoon', '2.1.0'
end
Run Code Online (Sandbox Code Playgroud)
MyAssembly.swift
public class MyAssembly : TyphoonAssembly{
//Some definitions
}
Run Code Online (Sandbox Code Playgroud)
AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
…
var assembly : MyAssembly = MyAssembly()
//Always returns „true“
println("Is type of class: …
Run Code Online (Sandbox Code Playgroud) 我在Swift项目中使用Typhoon Framework 2.3.0版本时遇到了非常烦人的问题.
我在Podfile中包含Typhoon,如教程中提到的,安装了Pods,创建了桥接头并添加#import <Typhoon/Typhoon.h>
到此标题中.
然后我创建了名为ApplicationAssebly的汇编子类:
import Foundation
public class ApplicationAssembly: TyphoonAssembly {
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
definition.injectProperty("myAssembly", with: self)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我想将该程序集注入AppDelegate.我还在Info.plist文件中添加了TyphoonInitialAssemblies条目.在这一刻,我的问题已经开始.我测试了几个导致NSException的组合:
无法解析名称xxx的程序集
这种组合是(typhtest是项目/包名称):
我在StackOverflow上找到了这个答案,所以我尝试了最后一个组合:
这个组合不会抛出NSException但是我有dyld_fatal_error,来自iPhone 5s(iOS 7.1)的堆栈跟踪:
我从iPhone模拟器(iOS 7.1)获得略有不同的堆栈跟踪:
有什么奇怪的,它适用于iOS 8.1模拟器!另外台风示例应用程序为斯威夫特的作品以及我的设备上.
我还试图清理任何Xcode和项目缓存和DerivedData目录,我已经清理了项目和构建文件夹并重建了项目,但它无法正常工作.我的Xcode版本是6.1(6A1052d),我正在使用OSX Yosemite 10.10.1.
我的代码使用GitHub存储库: …
I have an app that has about 11 different Singleton instances used throughout the many app's methods and classes; it's getting out of hand, and I want to replace all of them with dependency injection, like Typhoon. However, I am unable to find any doc, sample or mention of how to replace the singletons with dependency injection, including Typhoon. For instance, do I use multiple instances of Typhoon, replacing each singleton with an instance of Typhoon?
我在Swift项目中使用Typhoon,需要使用@objc标记协议.我正在尝试将我的项目升级到Swift 2.
在我的iOS应用程序中,我的服务层将错误抛回UI.但是,尽管我付出了最大努力,但我收到了编译错误:
类型'ErrorThrower'不符合协议'Throwable'
@objc protocol Throwable {
func doSomething(someParam:AnyObject) throws
}
@objc class ErrorThrower : NSObject, Throwable {
func doSomething(someParam: AnyObject) throws {
NSLog("An error is about to be thrown")
throw GenericError.Generic
}
}
enum GenericError : ErrorType {
case Generic
}
Run Code Online (Sandbox Code Playgroud)
我看到这篇文章" Swift类不符合带有错误处理的Objective-C协议 "
所以,这让我尝试这样的事情:
@objc protocol Throwable {
func doSomething(someParam:AnyObject) throws
}
class ErrorThrower : NSObject, Throwable {
@objc(doSomethingAndReturnError:someParam:)
func doSomething(someParam: AnyObject) throws {
NSLog("An error is about to be thrown")
throw GenericError.Generic
}
}
Run Code Online (Sandbox Code Playgroud)
它没有抱怨@objc(...)的实现,但它仍然给出了相同的不符合协议错误.
我也试过这个没有运气...... …
我在Typhoon中定义了一个ApplicationAssembly.
所以我想要做的是:"这个类X需要注入符合Foo协议的东西.这是一个RealFoo,这是一个TestFoo.当我在现实生活中运行X时,我希望它能得到它一个RealFoo,但是当我运行我的集成测试时,我希望它能获得一个TestFoo".
我怎样才能做到这一点?
我在我的应用程序中使用了StoryBoard.当我第一次开始整合Typhoon时,我在plist中列出了Assemblies,如下所示:
<key>TyphoonInitialAssemblies</key>
<array>
<string>ApplicationAssembly</string>
<string>CoreComponents</string>
</array>
Run Code Online (Sandbox Code Playgroud)
当我注入AppDelegate时,这很好用.
现在,如果我需要注入不同的视图控制器,看来我不得不删除UILaunchStoryboardName
,并UIMainStoryboardFile
从应用程序的plist文件,并使用TyphoonStoryboard
像这样:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString *storyboardName = ...
TyphoonComponentFactory *factory = ...
TyphoonStoryboard *storyboard = [TyphoonStoryboard
storyboardWithName:storyboardName factory:factory bundle:nil];
self.window = ...
self.window.rootViewController = [storyboard instantiateInitialViewController];
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
但是,我很困惑我获得的地方TyphoonComponentFactory
.既然我已经在plist中列出了程序集,我可以以某种方式使用它吗?
我正在 plist 中配置初始组件,它们用于实例化故事板中的第一个控制器。
稍后在应用程序中我将使用以下命令更改根视图控制器:
TyphoonStoryboard* storyboard = [TyphoonStoryboard storyboardWithName:storyboardType factory:factory bundle:nil];
UIViewController* newRootView = [storyboard instantiateViewControllerWithIdentifier:identifier];
self.window.rootViewController = newRootView;
Run Code Online (Sandbox Code Playgroud)
我想在实例化新视图控制器时使用相同的程序集。原因是我希望单身人士继续单身。如果程序集/工厂发生更改,所有类都会重新创建,包括单例。
我如何获得用于初始化故事板中第一个视图控制器的工厂?
我正在快速使用台风,不知怎的,我的组件不会通过注入物质注入.对于像Strings
它这样的简单类型.我提供了一个简单的例子来解释这个问题.的输出示出了结果serviceB
有一个空引用serviceA
.所有String
属性都已正确设置,不会引发任何错误.我在这里做错了什么?
XCode:6-beta5,台风:2.1.0
MYServiceA.swift
@objc(MYServiceA) public class MYServiceA : NSObject {
public var text : String!
}
Run Code Online (Sandbox Code Playgroud)
MYServiceB.swift
@objc(MYServiceB) public class MYServiceB : NSObject {
public var text : String!
public var serivceA : MYServiceA!
}
Run Code Online (Sandbox Code Playgroud)
MYAssembly.swift
public class MYAssembly : TyphoonAssembly {
public func serviceA() -> AnyObject {
var definitionBlock : TyphoonDefinitionBlock = {(definition : TyphoonDefinition!) in
definition.injectProperty("text", with: "some a text")
definition.scope = TyphoonScopeSingleton
}
return TyphoonDefinition.withClass(NSClassFromString("MYServiceA"), configuration: definitionBlock) …
Run Code Online (Sandbox Code Playgroud) 我已将我的大部分应用程序转换为Swift.剩下的是一些Objective-C协议,以及一些应该使用Swift习语代替Objective-C风格的代码.
我已经使用Typhoon组装了我的应用程序.现在将其中一个协议转换为Swift之后,我注意到初始化器不再是动态的(DI库需要).所以我尝试将其标记为动态,但出现以下错误:
它抱怨第三个参数(我的Swift协议)永远不能作为Objective-C的一部分参与.这似乎是Swift/ObjC互操作性的普遍限制.是唯一的解决方案来定义ObjC中的协议并让Swift类实现它吗?
以下解决方案不起作用:
public protocol WeatherReportDao : NSObjectProtocol { //Extend NSObjectProtocol
}
Run Code Online (Sandbox Code Playgroud) 我想用故事板创建一个名为"child"的视图控制器,所以我定义:
- (TyphoonStoryboard *)storyBoard
{
return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) {
[definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) {
[initializer injectParameterWith:@"Storyboard"];
[initializer injectParameterWith:self];
[initializer injectParameterWith:[NSBundle mainBundle]];
}];
definition.scope = TyphoonScopeSingleton; //Let's make this a singleton
}];
}
- (ChildViewController *)childViewControllerFromStoryboard
{
return [TyphoonDefinition withFactory:self.storyBoard selector:@selector(instantiateInitialViewController)];
}
Run Code Online (Sandbox Code Playgroud)
我将有一个将包含子视图控制器的根视图控制器
- (RootViewController *)rootViewController {
return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(initWithChildViewController:) parameters:^(TyphoonMethod *initializer) {
[initializer injectParameterWith:self.childViewControllerFromStoryboard];
}];
}];
}
Run Code Online (Sandbox Code Playgroud)
最后一部分只是为子视图控制器注入依赖项:
- (ChildViewController *)childViewController {
return [TyphoonDefinition withClass:[ChildViewController class] configuration:^(TyphoonDefinition *definition) {
// Initilization …
Run Code Online (Sandbox Code Playgroud) typhoon ×12
ios ×6
swift ×6
objective-c ×5
ios8 ×2
xcode ×2
cocoapods ×1
dyld ×1
interop ×1
storyboard ×1
swift2 ×1
xcode6 ×1
xcode6-beta5 ×1
xctest ×1