rob*_*ble 3 ios typhoon swift xcode6 ios8
我正在快速使用台风,不知怎的,我的组件不会通过注入物质注入.对于像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)
}
public func serviceB() -> AnyObject {
var definitionBlock : TyphoonDefinitionBlock = {(definition : TyphoonDefinition!) in
definition.injectProperty("text", with: "some b text")
definition.injectProperty("serivceA", with: self.serviceA())
definition.scope = TyphoonScopeSingleton
}
return TyphoonDefinition.withClass(NSClassFromString("MYServiceB"), configuration: definitionBlock)
}
}
Run Code Online (Sandbox Code Playgroud)
AppDelegate.swift
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
var assembly : MYAssembly = MYAssembly()
var factory : TyphoonComponentFactory = TyphoonBlockComponentFactory(assembly: assembly) as TyphoonComponentFactory
factory.makeDefault()
var serviceA : MYServiceA = TyphoonComponentFactory.defaultFactory().componentForKey("serviceA") as MYServiceA
println("MYServiceA")
println("- instance=\(serviceA != nil)")
println("- text=\(serviceA.text)")
var serviceB : MYServiceB = TyphoonComponentFactory.defaultFactory().componentForKey("serviceB") as MYServiceB
println("MYServiceB")
println("- instance=\(serviceB != nil)")
println("- text=\(serviceB.text)")
println("- serviceA.instance=\(serviceB.serivceA != nil)")
return true
}
..
}
Run Code Online (Sandbox Code Playgroud)
产量
MYServiceA
- instance=true
- text=some a text
MYServiceB
- instance=true
- text=some b text
- serviceA.instance=false
Run Code Online (Sandbox Code Playgroud)
台风组件充分利用了ObjC运行时的动态调度功能.反映程序集,并拦截每个方法(应用AOP'围绕'建议),以便Typhoon有一个蓝图来构建应用程序程序集中的每个组件.但是,Swift将尝试尽可能使用static/vtable dispatch(这会阻止所需的方法拦截).
要指示Swift需要动态调度,请将汇编方法标记为"动态".
示例:(需要Xcode6 beta 6)
public class MYAssembly : TyphoonAssembly {
public dynamic func serviceA() -> AnyObject {
var definitionBlock : TyphoonDefinitionBlock = {
(definition : TyphoonDefinition!) in
definition.injectProperty("text", with: "some a text")
definition.scope = TyphoonScopeSingleton
}
return TyphoonDefinition.withClass(MYServiceA.classForCoder(),
configuration: definitionBlock)
}
public dynamic func serviceB() -> AnyObject {
var definitionBlock : TyphoonDefinitionBlock = {
(definition : TyphoonDefinition!) in
definition.injectProperty("text", with: "some b text")
definition.injectProperty("serivceA", with: self.serviceA())
definition.scope = TyphoonScopeSingleton
}
return TyphoonDefinition.withClass(MYServiceB.classForCoder(),
configuration: definitionBlock)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |