手动转换 TyphoonConfig

Manually convert TyphoonConfig

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

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() 来自 Type TyphoonInjectionByConfig。

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

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 的转换器。您还可以注册自己的转换器,如 here 所述。