我想(静态地)根据launch参数定义一个全局Swifttypealias
。
斯威夫特让我用常数来做:
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
但这并不能编译。有办法做到这一点吗?
最佳答案
你不能这样做。类型别名是在编译时计算的,当您的项目生成时,而您试图做的事情发生在运行时。在运行时,所有类型别名都已设置到位。
对于UI测试的用例,更好的解决方案是使用协议,并基于launch参数实例化所需的对象:
protocol ClientProtocol {
}
struct FakeAPIClient: ClientProtocol {
}
struct ProductionAPIClient: ClientProtocol {
}
func createClient() -> ClientProtocol {
return isUITesting ? FakeAPIClient() : ProductionAPIClient()
}
在应用程序中需要的任何地方都可以使用协议,而不是使用类型别名。
注意。
createClient
是一个所谓的工厂函数,可以用于多种场景,而不仅仅是这个UI测试。例如,可以有一个基于AFNetworking
的API客户机和一个基于NSURLSession
的API客户机,并且可以通过简单的标志更改在两者之间轻松切换。关于ios - 根据启动参数定义快速类型别名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34998351/