1

基本上我想做这样的事情。

public dynamic func someClass() -> AnyObject {
    return TyphoonDefinition.withClass(SomeClass.self) {
        (definition) in

        definition.useInitializer("initWithHost:") {
            (initializer) in

            let url: NSURL! = TyphoonConfig("someUrl") as NSURL
            initializer.injectParameterWith(url.host)
        }
    }
}

但是 TyphoonConfig() 来自 TyphoonInjectionByConfig 类型。

是否可以手动转换 TyphoonConfig 对象,还是我需要注入它然后它会转换?

4

1 回答 1

1

TyphoonConfig 允许在外部配置文件中以 .properties、.plist 或 .json 格式定义配置。由于这些格式提供的类型有限,Typhoon 提供了内置的类型转换器来将字符串表示形式转换为所需的类型。内置转换器用于原语和常见类型,如 NSURL、UIColor。您也可以定义自己的。

要外部化 NSURL,请创建一个引用您的配置的定义:

/*
 * A config definition, referencing properties that will be loaded from a plist. 
 */
public dynamic func config() -> AnyObject {

    return TyphoonDefinition.configDefinitionWithName("Configuration.plist")
}

用它:

public dynamic func someClass() -> AnyObject {
    return TyphoonDefinition.withClass(SomeClass.self) {
        (definition) in

        definition.useInitializer("initWithHost:") {
            (initializer) in

            initializer.injectParameterWith(TyphoonConfig("someUrl"))
        }
    }
}

并按如下方式创建配置文件。

<plist version="1.0">
<dict>
    <key>someUrl</key>
    <string>NSURL(http://api.worldweatheronline.com/free/v2/weather.ashx)</string>
    <key>api.key</key>
    <string>dbaffee6eb10d4fdc1a5d333554e4</string>
    <key>days.to.retrieve</key>
    <string>NSNumber(5)</string>
</dict>
</plist>

请注意,我们将值声明为NSURL(http://api.worldweatheronline.com/free/v2/weather.ashx),这意味着 Typhoon 将在其转换器注册表中查找可以处理 NSURL 的转换器。您还可以注册自己的转换器,如此所述。

于 2015-03-25T23:10:58.843 回答