gpt4 book ai didi

ios - 根据启动参数定义快速类型别名

转载 作者:行者123 更新时间:2023-11-28 10:21:05 25 4
gpt4 key购买 nike

我想(静态地)根据启动参数定义一个全局 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

但这不能编译。有办法实现吗?

最佳答案

你不能这样做。类型别名是在编译时计算的,当你的项目被构建时,而你试图做的事情发生在运行时。在运行时,所有类型别名都已就位。

对于您的 UI 测试用例,更好的解决方案是使用协议(protocol),并根据启动参数实例化您需要的对象:

protocol ClientProtocol {
}

struct FakeAPIClient: ClientProtocol {
}

struct ProductionAPIClient: ClientProtocol {
}

func createClient() -> ClientProtocol {
return isUITesting ? FakeAPIClient() : ProductionAPIClient()
}

您可以在应用程序中需要的任何地方使用协议(protocol),而不是使用类型别名。

注意。 createClient 是所谓的工厂函数,可以在多种场景中使用,而不仅仅是 UI 测试。例如,您可以拥有一个基于 AFNetworking 的 API 客户端和一个基于 NSURLSession 的 API 客户端,并通过简单的标志更改轻松在两者之间切换。

关于ios - 根据启动参数定义快速类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34998351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com