我想(静态地)根据启动参数定义一个全局Swift typealias。
Swift让我用常量做到这一点:
protocol Client {
}
struct FakeAPIClient: Client {
}
struct ProductionAPIClient: Client {
}
private var isUITesting: Bool {
return NSProcessInfo.processInfo().arguments.contains("UI-TESTING")
}
let APIClient: Client.Type = isUITesting ? FakeAPIClient.self : ProductionAPIClient.self我如何用类型别名实现同样的功能呢?我想做一些类似的事情:
struct FakeAPIClient {
}
struct ProductionAPIClient {
}
private var isUITesting: Bool {
return NSProcessInfo.processInfo().arguments.contains("UI-TESTING")
}
typealias Client = isUITesting ? FakeAPIClient : ProductionAPIClient但是这不能编译。有没有办法做到这一点?
发布于 2016-01-26 01:25:45
您不能这样做。类型别名是在编译时计算的,当您的项目构建时,而您试图做的事情发生在运行时。在运行时,所有类型别名都设置到位。
对于UI测试的用例,更好的解决方案是使用协议,并基于启动参数实例化所需的对象:
protocol ClientProtocol {
}
struct FakeAPIClient: ClientProtocol {
}
struct ProductionAPIClient: ClientProtocol {
}
func createClient() -> ClientProtocol {
return isUITesting ? FakeAPIClient() : ProductionAPIClient()
}您可以在应用程序中需要的任何地方使用协议,而不是使用类型别名。
注意: createClient是一个所谓的工厂函数,可以在多个场景中使用,而不仅仅是这个UI测试场景。例如,您可以有一个基于AFNetworking的API客户端和一个基于NSURLSession的API客户端,只需更改一个简单的标志,就可以在这两个客户端之间轻松切换。
https://stackoverflow.com/questions/34998351
复制相似问题