【问题标题】:defining swift typealiases according to launch arguments根据启动参数定义快速类型别名
【发布时间】:2016-01-25 17:15:18
【问题描述】:

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

如何使用 typealiases 实现相同的目标?我想做类似的事情:

struct FakeAPIClient {
}
struct ProductionAPIClient {
}

private var isUITesting: Bool {
    return NSProcessInfo.processInfo().arguments.contains("UI-TESTING")
}

typealias Client = isUITesting ? FakeAPIClient : ProductionAPIClient

但这不能编译。有没有办法做到这一点?

【问题讨论】:

  • 你不是在描述一个泛型吗?当然,细节取决于你想用这个动态解析的类型做什么
  • 只调用ProductionAPIClientFakeAPIClient 共有的静态方法。可以只用泛型来完成吗?
  • 你不能在运行时定义“静态”的东西。 “静态”意味着它是在编译时定义的。这就是静态和动态的区别。
  • 你的问题的问题在于你没有解释你最终想要做什么。正如我所说,这可能通过通用或协议采用来解决,但我不知道您要解决什么

标签: ios xcode swift macos type-alias


【解决方案1】:

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

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

protocol ClientProtocol {
}

struct FakeAPIClient: ClientProtocol {
}

struct ProductionAPIClient: ClientProtocol {
}

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2012-03-04
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多