我想(静态地)根据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/

10-13 02:29